我对一个问题感到困惑,并希望同样的想法
考虑我有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中出现,我想把它作为一个值附加到ID D1和D2中的列,并用0填充相应的Y列。
列表中的所有三个元素最终应该具有相同的ID列,这是来自三个数据帧的ID值的并集
我试图做一个rbind.fill或类似的东西,但无法搞清楚,我在处理列表方面有点弱。任何帮助都感激不尽。
非常感谢你,希望你周末愉快!
答案 0 :(得分: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)))
答案 1 :(得分: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
答案 2 :(得分: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