【问题标题】:Augment data frame missed values by another data frame用另一个数据框增加数据框缺失值
【发布时间】:2012-04-18 14:20:50
【问题描述】:

我有以下数据框:

> df1 = data.frame(ind = 1:4, x=c('a', 'b', NA, 'd'))
> df2 = data.frame(ind = 1:4, x=c(NA, NA, 'c', NA))
> df1
  ind    x
1   1    a
2   2    b
3   3 <NA>
4   4    d
> df2
  ind    x
1   1 <NA>
2   2 <NA>
3   3    c
4   4 <NA>

我想将它们组合起来,用 df2 中的数值填充 df1 中的缺失值。我怎样才能做到这一点?我不能使用合并或连接命令来做到这一点:

> merge(df1, df2, by='ind', all=T)
  ind  x.x  x.y
1   1    a <NA>
2   2    b <NA>
3   3 <NA>    c
4   4    d <NA>

【问题讨论】:

    标签: r join merge


    【解决方案1】:

    您构建测试用例的方式会产生一些因素,这会给紧凑型解决方案带来额外的障碍,因为级别不一致。您可以使用 levels= 它们唯一值的并集来创建因子,或者最好使用字符向量:

    df1 = data.frame(ind = 1:4, x=c('a', 'b', NA, 'd'), stringsAsFactors=FALSE)
    df2 = data.frame(ind = 1:4, x=c(NA, NA, 'c', NA), stringsAsFactors=FALSE)
    df1[is.na(df1)] <- df2[is.na(df1)] # the key is same index on both sides
     df1
    #---------
      ind x
    1   1 a
    2   2 b
    3   3 c
    4   4 d
    

    可能不太受欢迎的方法(但对于您不想重新处理的一对就地数据集来说可能更好)是:

     df1$x <- factor(df1$x, levels=union(levels(df1$x), levels(df2$x) ) )
     df2$x <- factor(df2$x, levels=union(levels(df1$x), levels(df2$x) ) )
     df1[is.na(df1)] <- df2[is.na(df1)]
    

    【讨论】:

    • 谢谢,这是一个很好的解决方案。尽管如此,我在使用它时遇到了问题:head(a[is.na(a)]) 报告了我的数据上的非 NA 值(太大而无法在此处发布)。可能是什么原因?可能是由其中一列中的因素引起的吗?
    • 请忽略上一条消息的技术部分。我解决了问题
    【解决方案2】:

    这个怎么样:

    rbind(df1[complete.cases(df1),],df2[complete.cases(df2),])
      index x
    1     1 a
    2     2 b
    3     3 c
    4     4 d
    

    【讨论】:

    • 只有在所有遗漏的值都位于第二个表的末尾时才有效。我的数据更复杂,所以它不起作用。我现在将编辑问题
    • @gadubishe 我的解决方案仍然适用于您修改后的示例。如果您期待特定的排序,您只需在事后对数据框进行排序,仅此而已。
    • 我知道提问者可能不想删除两个数据帧中都缺失的行。
    【解决方案3】:

    如果x 在两个数据集中都是NA,你会怎么做?这符合您的要求吗?

    x <- merge(df1, df2, all = TRUE, by = "ind")
    x <- transform(x, newcol = ifelse(is.na(x.x), as.character(x.y), as.character(x.x)))
    
    > x
      ind  x.x  x.y newcol
    1   1    a <NA>      a
    2   2    b <NA>      b
    3   3 <NA>    c      c
    4   4    d <NA>      d
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多