2016-05-01 42 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