2014-02-14 133 views
1

我有一个数据帧(DF),并希望通过将第一列中的NA替换为第二列中的值来组合第一列中的两列。下面是一个示例DF:R结合两个数据帧由NA

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包含两列中从一到十的数字。

我希望列A中的NAs被列B中的值替换。但只有A的NAs!

我想:

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

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

我发现的解决方案主要处理merge()或paste(),但我认为这不会对此有所帮助。欢迎您的建议,如往常一样:)

非常感谢!

+0

是否有必要有因素而不是字符? – digEmAll

+0

不,它不是。应该已经测试过了。抱歉。 –

回答

2

问题是您使用因素。这应该工作:

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)

+0

太好了。阅读你的解决方案后显然是明显的...并且测试因素现在将成为我的错误搜索例程的一部分:)谢谢。 –

+0

这是令人困惑的,我知道。我开始时遇到类似的问题。如果您想要在修改数据之前避免将'data.frame'函数转换为因素,请使用'stringsAsFactors = FALSE'选项。例如:'data.frame(apply(X,2,as.character),stringsAsFactors = F)' – Mikko