将具有相交的基因和冗余列的data.frame列表连接到单个唯一的data.frame中

时间:2018-11-14 08:59:10

标签: r reduce purrr

我有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.1df.2相同,df.3df.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,...添加到冗余列即可。

1 个答案:

答案 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)