2014-02-14 155 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