R 在数据帧列表中,将列表特定元素中出现的变量值添加到列表所有元素中的同一变量
我被一个问题困住了,希望能有同样的想法 假设我有一个包含3个数据帧的列表:R 在数据帧列表中,将列表特定元素中出现的变量值添加到列表所有元素中的同一变量,r,list,dataframe,R,List,Dataframe,我被一个问题困住了,希望能有同样的想法 假设我有一个包含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),
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)
D1您可以创建一个单列数据框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)))
库(dplyr)
IDs另一种选择
这将需要一些后期处理清理,但:
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
set.seed(42)
D1这里是另一个使用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
库(dplyr)
减少(函数(…)完全连接(…,by=“ID”),L)
#ID Y.x Y.Y
#110是不是是
#29不,是的,是的
#3不
#4.6是否
#5.4是的
#6 8不,不,是
#7.5不,是的
#8.1是的
#9.2是的
#107不,不,是的
#11 14没有
#是的是的
#13 11没有
#14 13是否
#15 16是的
#16 15号
谢谢您的回答。这个解决方案对我来说很好,因为它返回数据帧的原始列表。关于将变量Y中的NAs设置为0,有什么建议吗?我使用这样的函数替换NAs:将_zero _设置为_value您可以循环遍历列表,并将“y”列中的NA
替换为零<代码>L嗯,我们在说话吗?