2016-03-08 91 views
1

我一直在使用dplyrmerge函數,但是我只是遇到了一個我無法弄清楚如何以簡單的方式完成的任務。我想合併兩個數據框。第二個數據框有一些列丟失。我希望合併的輸出將這些值填入第一個數據幀的相應值。如何合併填充R中缺失值的2個數據幀?

的數據幀是這樣的:

#df1 
participant = c(1,2,3) 
age   = c(18,23,19) 
gender  = c(rep("female",2),"male") 
experiment = rep("noun",3) 
rt   = c(218,111,546) 
df1   = data.frame(participant, age, gender,experiment,rt) 

    participant age gender experiment rt 
1   1 18 female  noun 218 
2   2 23 female  noun 111 
3   3 19 male  noun 546 

#df2 
participant = c(1,2,3) 
experiment = rep("verb",3) 
rt   = c(238,251,140) 
df2   = data.frame(participant, experiment,rt) 

    participant experiment rt 
1   1  verb 238 
2   2  verb 251 
3   3  verb 140 

這是輸出數據幀看起來應該像:

participant age gender experiment rt 
1   1 18 female  noun 218 
2   2 23 female  noun 111 
3   3 19 male  noun 546 
4   1 18 female  verb 238 
5   2 23 female  verb 251 
6   3 19 male  verb 140 

的目標是,df2使用列參與者合併,並且列的年齡和性別的值取自df1。我已經嘗試了很多東西(所有類型的join,rbind.fill等),我也在論壇中四處看了一下,但我找不到一個簡單的方法來實現綁定兩個數據框的行並填充缺失值在df2中使用特定列作爲參考。在我的例子中,只有2列需要填寫(年齡和性別),但我的真實df1還有更多,所以我想避免用手指定它們。

如果您有任何數據合併嚮導有建議,我將非常感激!

回答

4

我們把數據集在list,使用rbindlistfill=TRUE(從data.table),通過分組「的參與者,我們分配(:=)的‘年齡’和‘性別’作爲非NA該列中的值。

library(data.table) 
rbindlist(list(df1, df2), fill=TRUE)[, c('age', 'gender') := 
     lapply(.SD, na.omit) , participant, .SDcols=age:gender][] 
# participant age gender experiment rt 
#1:   1 18 female  noun 218 
#2:   2 23 female  noun 111 
#3:   3 19 male  noun 546 
#4:   1 18 female  verb 238 
#5:   2 23 female  verb 251 
#6:   3 19 male  verb 140 

或者只使用base R,我們rbind是在這兩個數據集公共列的子集,然後創建基於在一個數據集中發現的,而不是在其他列的其他列。

i1 <- intersect(names(df1), names(df2)) 
res <- rbind(df1[i1], df2[i1]) 
nm1 <- setdiff(names(df1),i1) 
res[nm1] <- df1[nm1] 
res 
# participant experiment rt age gender 
#1   1  noun 218 18 female 
#2   2  noun 111 23 female 
#3   3  noun 546 19 male 
#4   1  verb 238 18 female 
#5   2  verb 251 23 female 
#6   3  verb 140 19 male 
+0

有什麼辦法可以讓合併(df1,df2,all = TRUE)工作來完成這項任務嗎? 您會收到年齡和性別的缺失值,剩下的唯一事情就是將年齡和性別值複製到每個觀察值。是否有快速的方法來爲每個匹配的參與者複製這些值。 很好的解決方案btw。 – InfiniteFlashChess

+1

@InfiniteFlashChess我想你可以在'merge'ing之後使用同樣的方法來替換'rbindlist'解決方案中的'NA'值。但是,我認爲'merge'會比'rbindlist'慢# – akrun

+1

@akrun:謝謝!我希望有一些內置的方法可以用'dplyr'完成,但是你的'base R'解決方案很好。我認爲我比rbindlist更喜歡它,因爲它不需要指定要手動填充的列(我的'df1'有一堆,不僅僅是兩個,所以它可能會很乏味) – Sol