2016-05-01 58 views
1

我被困在一個問題中的所有元素同一個變量的變量值和希望任何想法相同在dataframes的列表,添加發生在列表的特定元素列表

考慮我有3個數據幀的列表:

D1 <- data.frame(ID = sample(1:10), Y = sample(c("yes", "no"), 10, replace =TRUE)) 
D2 <- data.frame(ID = sample(5:14), Y = sample(c("yes", "no"), 10, replace = TRUE)) 
D3 <- data.frame(ID = sample(7:16), Y = sample(c("yes", "no"), 10, replace = TRUE)) 
L <- list(D1, D2, D3) 
names <- c(D1, D2, D3) 
names(L) <- names 
DF<-as.list(names(L)) 
L <- mapply(cbind, L, "DF"=DF, SIMPLIFY=F) 

我想改變變量ID以這樣的方式,如果一個特定的ID,ID = 16,例如,不D1和D2,但僅發生在D3中,我想將它作爲值附加到D1和D2中的ID列,並用0填充相應的Y列。

列表中的所有三個元素應該最終具有相同的ID列,這是來自三個數據幀的ID值的聯合

我試圖做一個rbind.fill或類似的東西,但無法弄清楚,我總體來說,處理名單有點虛弱。任何幫助都感激不盡。

非常感謝你,希望你有一個愉快的週末!

+0

嗯,我們正在談論[這](HTTP:/ /stackoverflow.com/questions/8091303/simultaneously-merge-multiple-data-frames-in-a-list)? –

回答

1

您可以創建單列數據框IDs,然後與列表中的每個數據框合併,其中all = T將所有ID添加到每個數據框。

library(dplyr) 
IDs <- data.frame(ID = unique(c(D1$ID, D2$ID, D3$ID))) 
L <- lapply(L, function(df) merge(df, IDs, by = "ID", all = T) %>% 
          mutate(Y = ifelse(is.na(Y), 0, Y))) 
+0

謝謝你的回答。這個解決方案適用於我,因爲它返回數據框的原始列表。有關將變量Y中的NAs設置爲0的任何建議?我用類似這樣的函數替換NA:set_zero_as_value < - function(x,value = 0){[x ==「NA」] < - value return(x) } ...但沒有太大的成功。再次感謝! –

+0

您可以循環訪問列表,並將'y'列中的'NA'替換爲零。 'L < - lapply(L,function(df)df $ Y [is.na(df $ Y)] < - 0)'。 – Psidom

0

另一種選擇。

這將需要一些後處理清理,但:

set.seed(42) 
D1 <- data.frame(ID = sample(1:10), Y = sample(c("yes", "no"), 10, replace =TRUE)) 
D2 <- data.frame(ID = sample(5:14), Y = sample(c("yes", "no"), 10, replace = TRUE)) 
D3 <- data.frame(ID = sample(7:16), Y = sample(c("yes", "no"), 10, replace = TRUE)) 
L <- list(D1, D2, D3) 
Reduce(function(a,b) merge(a, b, by="ID", all.x=TRUE, all.y=TRUE), L) 
# ID Y.x Y.y Y 
# 1 1 yes <NA> <NA> 
# 2 2 yes <NA> <NA> 
# 3 3 no <NA> <NA> 
# 4 4 yes <NA> <NA> 
# 5 5 no yes <NA> 
# 6 6 yes no <NA> 
# 7 7 no no yes 
# 8 8 no no yes 
# 9 9 no yes yes 
# 10 10 yes no yes 
# 11 11 <NA> no no 
# 12 12 <NA> yes yes 
# 13 13 <NA> yes no 
# 14 14 <NA> no no 
# 15 15 <NA> <NA> no 
# 16 16 <NA> <NA> yes 
0

下面是使用full_join另一種選擇從dplyr

library(dplyr) 
Reduce(function(...) full_join(..., by="ID"), L) 
# ID Y.x Y.y Y 
#1 10 yes no yes 
#2 9 no yes yes 
#3 3 no <NA> <NA> 
#4 6 yes no <NA> 
#5 4 yes <NA> <NA> 
#6 8 no no yes 
#7 5 no yes <NA> 
#8 1 yes <NA> <NA> 
#9 2 yes <NA> <NA> 
#10 7 no no yes 
#11 14 <NA> no no 
#12 12 <NA> yes yes 
#13 11 <NA> no no 
#14 13 <NA> yes no 
#15 16 <NA> <NA> yes 
#16 15 <NA> <NA> no