代码之家  ›  专栏  ›  技术社区  ›  Digvijay Sawant

在r中将选定行值从1个数据帧复制到另一个数据帧

  •  0
  • Digvijay Sawant  · 技术社区  · 6 年前

    我有一个数据框: df <- data.frame(id = c('1','2','3'), b = c('b1', 'NA', 'b3'), c = c('c1', 'c2', 'NA'), d = c('d1', 'NA', 'NA'))

    id b   c   d
    1  b1  c1  d1
    2  NA  c2  NA
    3  b3  NA  NA
    

    我已经提取了 id = 1 df 对另一个数据帧说 df2 所以 小精灵 有1行

    id b c d
    1 b1 c1 d1
    

    我需要复制所有值 df2 to df1 哪里没有 NA 在里面 df1 结果表:

    id b   c   d
    1  b1  c1  d1
    2  b1  c2  d1
    3  b3  c1  d1
    

    提前谢谢你。我之前也问过类似的问题,但删除了。

    2 回复  |  直到 6 年前
        1
  •  1
  •   hpesoj626    6 年前

    根据你上次的评论 df2[3,3] 应该是 c2 而不是 c1 ,一个简单的答案是 zoo::na.locf .

    library(zoo)
    df2 <- na.locf(df)
    
    #   id  b  c  d
    # 1  1 b1 c1 d1
    # 2  2 b1 c2 d1
    # 3  3 b3 c2 d1
    

    数据

    df <- structure(list(id = c(1, 2, 3), b = c("b1", NA, "b3"), c = c("c1", 
    "c2", NA), d = c("d1", NA, NA)), class = "data.frame", row.names = c(NA, 
    -3L))
    
        2
  •  1
  •   Resham Wadhwa    6 年前

    假设您的问题中存在错误->df2将等于b1-c1-d1而不是b1-c2-d1,下面是解决方案:

    初始化数据文件

    df <- data.frame(id = c('1','2','3'), b = c('b1', 'NA', 'b3'), c = c('c1', 'c2', 'NA'), d = c('d1', 'NA', 'NA'))
    

    将字符串NAS转换为实际可检测的NAS

    df <- data.frame(lapply(df, function(x) { gsub("NA", NA, x) }))
    

    获取默认值行

    df2<-df[df$id==1,]
    

    对于所有行,检查列单元格是否为NA,然后用同一列的DF2单元格填充

    for (r in 1:nrow(df)) for( c in colnames(df)) df[r,c]<-ifelse(is.na(df[r,c]),as.character(df2[1,c]),as.character(df[r,c]))