【问题标题】:R combine two data frames by NAR 按 NA 组合两个数据帧
【发布时间】:2014-02-14 10:58:58
【问题描述】:

我有一个数据框 (DF),并且喜欢通过将第一列中的 NA 替换为第二列中的值来组合第一列中的两列。这是一个示例 DF:

structure(list(A = structure(c(3L, 5L, 4L, 2L, 1L, NA, NA, NA, 
NA, NA), .Label = c("five", "four", "one", "three", "two"), class = "factor"), 
B = structure(c(4L, NA, NA, 2L, NA, 6L, 5L, 1L, 3L, 7L), .Label = c("eight", 
"four", "nine", "one", "seven", "six", "ten"), class = "factor")), .Names = c("A", 
"B"), row.names = c(NA, -10L), class = "data.frame")

如您所见,DF 在两列中包含从 1 到 10 的数字。

我希望将 A 列中的 NA 替换为 B 列中的值。但只有 A 的 NA!

我试过了:

X$A[is.na(X$A)] <- X$B[is.na(X$A)]

但这给了我一个无效的因子级别错误警告。

我发现的解决方案主要处理 merge() 或 paste(),但我认为这在这里没有帮助。欢迎您的建议,一如既往:)

非常感谢!

【问题讨论】:

  • 是否必须有因子而不是字符?
  • 不,不是。应该对此进行测试。对不起。

标签: r join merge dataframe


【解决方案1】:

问题在于您使用因子。这应该有效:

X$A <- as.character(X$A)
X$B <- as.character(X$B)
X$A[is.na(X$A)] <- X$B[is.na(X$A)]

如果您想避免 data.frame() 函数在修改数据之前将所有内容转换为因子,请使用 stringsAsFactors = FALSE 选项。例如:data.frame(apply(X, 2, as.character), stringsAsFactors = F)

【讨论】:

  • 太棒了。阅读您的解决方案后很明显......并且测试因素现在将成为我的错误搜索例程的一部分:) 谢谢。
  • 这很令人困惑,我知道。我刚开始的时候也有类似的问题。如果您想避免 data.frame 函数在修改数据之前将所有内容转换为因子,请使用 stringsAsFactors = FALSE 选项。例如:data.frame(apply(X, 2, as.character), stringsAsFactors = F)
猜你喜欢
  • 2019-03-29
  • 1970-01-01
  • 2013-12-19
  • 2020-10-26
  • 2014-04-14
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多