我有list
个中的data.frame
个。 data.frame
中的一些是冗余的,在非冗余的当中,行(由id
表示)的行并不相同,但它们确实重叠:
set.seed(2)
ids.1.2 <- paste0("id",sample(30,10,replace = F))
ids.3.4 <- paste0("id",sample(30,20,replace = F))
df.1 <- data.frame(id = ids.1.2,matrix(rnorm(100),10,10,dimnames = list(NULL,paste0("s.1.2:",1:10))))
df.2 <- df.1
df.3 <- data.frame(id = ids.3.4,matrix(rnorm(300),20,15,dimnames = list(NULL,paste0("s.3.4:",1:15))))
df.4 <- df.3
df.list <- list(df.1, df.2, df.3, df.4)
因此,在这种情况下,df.1
和df.2
相同,df.3
和df.4
也相同,并且两个集合在id
上相交:< / p>
"id6" "id21" "id17" "id5" "id24" "id11" "id12
是否有一种purrr::reduce
或类似的方式将此列表组合成一个具有唯一列和相交data.frame
的单个id
?
我会使用:
purrr::reduce(df.list, dplyr::inner_join,by = "id")
如果所有data.frame
都有唯一的列。但在我的情况下,使用此功能将.x
,.y
,...添加到冗余列即可。
答案 0 :(得分:1)
我不确定那是否就是你的意思,但是我首先会删除相同的数据帧,然后将其余的合并。这不是一个很好的解决方案,您可以在各处进行调整,但是如果我做对了,它会为您提供理想的结果。您可能需要在combinations
数据框中添加一行删除相同组合的行,这样可以确保从列表中删除相同df时没有错误。
library(tidyr)
library(dplyr)
# create all possible combinations
names(df.list) <- 1:length(df.list)
combinations <- crossing(names(df.list), names(df.list))
colnames(combinations) <- c("v1", "v2")
# remove self-combinations
combinations <- combinations[!combinations$v1 == combinations$v2,]
# check which cases are identical
combinations$check <- sapply(1:nrow(combinations), function(x){combinations[x,] <- identical(df.list[[combinations$v1[x]]], df.list[[combinations$v2[x]]])})
combinations <- combinations[combinations$check == T,]
# remove identical cases
for(i in 1:length(df.list)){
if(combinations$v1[i] == names(df.list)[i] & combinations$v1[i] %in% names(df.list)){df.list[i] <- NULL}
}
# combine dataframes
bind_rows(df.list)