2012-10-29 38 views
4

我經常遇到必須從另一個數據源「填寫」信息的情況。從其他數據源回填

例如:現在

x <- data.frame(c1=letters[1:26],c2=letters[26:1]) 
x[x$c1 == "m","c2"] <- NA 
x[x$c1 == "a","c2"] <- NA 

    c1 c2 
1 a <NA> 
2 b y 
3 c x 
4 d w 
5 e v 
6 f u 
7 g t 
8 h s 
9 i r 
10 j q 
11 k p 
12 l o 
13 m <NA> 
... 

,與缺失的變量,我想檢查,並使用一個單獨的data.frame填充它,讓稱之爲y

y <- data.frame(c1=c("m","a"),c2=c("n","z")) 

所以,我想要發生的事情是用y填充x。 (第13行應該是c(「m」,「n」),第1行應該是c(「a」,「z」))

我用來處理這個問題的方法似乎是錯綜複雜和間接的。你的方法是什麼?請記住,我的數據不一定像這樣的順序很好,但訂單應保留在x。我的首選是解決方案,不依賴於任何東西,但基地R.

+0

在你的數據,並'y'只包含一個列,如例子?還是有其他無關數據?另外,我猜你可以在你的'x'數據框中有多個'NA'?他們總是在'$ c2'? –

+0

這個例子很簡單,但在我的真實數據中有多行數據需要替換。 –

回答

3

如果你處理character變量,而不是factors,這將是一個更簡單的命題。

我將提供一個簡單的data.table溶液(優雅和易於使用的語法以及許多其他優點)

x <- data.frame(c1=letters[1:26],c2=letters[26:1], stringsAsFactors =FALSE) 
x[x$c1 == "m","c2"] <- NA 
y <- data.frame(c1="m",c2="n", stringsAsFactors = FALSE) 
library(data.table) 
X <- as.data.table(x) 
Y <- as.data.table(y) 

用於合併的簡單起見,我將創建指示

X[,missing_c2 := is.na(c2)] 
# a similar column in Y 
Y[,missing_c2 := TRUE] 

setkey(X, c2, missing_c2) 
setkey(Y, c2, missing_c2) 
# merge and replace (by reference) those values in X with the the values in `Y` 
X[Y, c2 := i.c2] 

i.c2意味着我們使用i參數中的c2的值到[

這種方法假設,如果c1 = 'm'將在X丟失並不是所有的值,你不想與'm'其中c1='m'替換c2所有的值,只有那些缺少


底液

這是一個基本的解決方案 - 我使用合併,以便y data.frame可以包含更多missing替換比實際需要(即可能具有所有c1值的值,但只需要c1= m``。

# add a second missing value row because to make the solution more generalizable 
x <- rbind(x, data.frame(c1 = 'm',c2 = NA, stringsAsFactors = FALSE)) 
missing <- x[is.na(x$c2),] 
merged <- merge(missing, y, by = 'c1') 

x[is.na(x$c2),] <- with(merged, data.frame(c1 = c1, c2 = c2.y, stringsAsFactors = FALSE)) 

如果您使用factors,您會碰到一堵牆,確保水平相符。

+0

+1 data.table看起來很棒,但對於這個特殊的問題,我想留在基地。 –

+0

我已經添加了一個基礎解決方案。 – mnel

+1

爲什麼不添加你已經對你的問題做了什麼 - 然後答案可能會解決你的*真實*問題。何時合併不直觀? – mnel

2

在基礎R,我相信這會爲你工作:

nas <- is.na(x$c2) 
x[nas, ] <- y[y$c1 %in% x[nas, 1], ] 
+1

是的,我喜歡這個,我唯一的問題是,當我在我的真實數據上使用這個。 true-false值是未排序的,因此它返回順序無關緊要的值,但在我的示例中卻是這樣。我不確定如何在我的問題中反映這一點。我會稍微考慮一下,稍後再更新。 –

+1

我認爲你需要'合併'然後替換,看看我的解決方案。 – mnel

+0

啊,我明白了 - 我不明白你原來的問題。在這種情況下,我認爲@ mnel是正確的。 –