R合并数千个数据帧,但未给出预期的列数

R合并数千个数据帧,但未给出预期的列数,r,dataframe,dplyr,R,Dataframe,Dplyr,我有一个数千个数据帧的列表,其中每个数据帧都有一个名为“x”的列和一个名为“go”的列。看起来是这样的: > lapply(head(genes2Vecs), head) $A1BG x go GO:0005576 0.13793103 GO:0005576 GO:0005615 0.05172414 GO:0005615 GO:0031982 0.24137931 GO:0031982 GO:0043227 0.25862069 G

我有一个数千个数据帧的列表,其中每个数据帧都有一个名为“x”的列和一个名为“go”的列。看起来是这样的:

> lapply(head(genes2Vecs), head)
$A1BG
                    x         go
GO:0005576 0.13793103 GO:0005576
GO:0005615 0.05172414 GO:0005615
GO:0031982 0.24137931 GO:0031982
GO:0043227 0.25862069 GO:0043227
GO:0043230 0.05172414 GO:0043230
GO:1903561 0.03448276 GO:1903561

$A1CF
                    x         go
GO:0005488 0.11111111 GO:0005488
GO:0097159 0.06944444 GO:0097159
GO:1901363 0.06944444 GO:1901363
GO:0003676 0.05555556 GO:0003676
GO:0003723 0.04166667 GO:0003723
GO:0006139 0.13888889 GO:0006139

$AACS
                    x         go
GO:0008152 0.12500000 GO:0008152
GO:0044238 0.02173913 GO:0044238
GO:0071704 0.07065217 GO:0071704
GO:0003824 0.03804348 GO:0003824
GO:0016405 0.01630435 GO:0016405
GO:0016874 0.03260870 GO:0016874

$AARS2
                    x         go
GO:0000166 0.06930693 GO:0000166
GO:0005488 0.27722772 GO:0005488
GO:0008144 0.01980198 GO:0008144
GO:0017076 0.04950495 GO:0017076
GO:0030554 0.02970297 GO:0030554
GO:0032553 0.03960396 GO:0032553

$AATK
                    x         go
GO:0000166 0.10769231 GO:0000166
GO:0005488 0.27692308 GO:0005488
GO:0008144 0.03076923 GO:0008144
GO:0017076 0.07692308 GO:0017076
GO:0030554 0.04615385 GO:0030554
GO:0032553 0.06153846 GO:0032553

$ABAT
                     x         go
GO:0005488 0.054644809 GO:0005488
GO:0008144 0.008196721 GO:0008144
GO:0019842 0.008196721 GO:0019842
GO:0036094 0.010928962 GO:0036094
GO:0043167 0.013661202 GO:0043167
GO:0043168 0.005464481 GO:0043168
我想把它们合并成这样的东西

          go A1BG       A1CF       AACS      AARS2      AATK       ABAT
1 GO:0000003   NA 0.06944444         NA         NA        NA 0.01639344
2 GO:0000049   NA         NA         NA 0.00990099        NA         NA
3 GO:0000166   NA         NA 0.03804348 0.06930693 0.1076923         NA
4 GO:0000959   NA         NA         NA 0.02970297        NA         NA
5 GO:0001101   NA         NA 0.01630435         NA        NA         NA
6 GO:0001505   NA         NA         NA         NA        NA 0.01912568
我所拥有的列表(
genes2Vecs
)的长度为
2584
,因此我希望生成的数据帧有那么多列。我尝试了两种不同的技术来合并这个列表,但它们都给了我答案

  • 列数不正确
  • 不是列表元素名称的列
我试过了

genes <- Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = "go", all = TRUE), 
                genes2Vecs)

genes我建议使用一个列表,其中第一个元素包含列表中所有数据帧中的所有基因id。这样,您就可以使用
Reduce()
合并所有数据。此外,如果您希望通过列表中元素的名称标识每一列,则应该更改对象中所有数据帧中的名称。下面是完成任务的代码:

最初,一些数据取自您的问题:

#Data
genes2Vecs <- list(A1BG = structure(list(x = c(0.13793103, 0.05172414, 0.24137931, 
0.25862069, 0.05172414, 0.03448276), go = c("GO:0005576", "GO:0005615", 
"GO:0031982", "GO:0043227", "GO:0043230", "GO:1903561")), class = "data.frame", row.names = c("GO:0005576", 
"GO:0005615", "GO:0031982", "GO:0043227", "GO:0043230", "GO:1903561"
)), A1CF = structure(list(x = c(0.11111111, 0.06944444, 0.06944444, 
0.05555556, 0.04166667, 0.13888889), go = c("GO:0005488", "GO:0097159", 
"GO:1901363", "GO:0003676", "GO:0003723", "GO:0006139")), class = "data.frame", row.names = c("GO:0005488", 
"GO:0097159", "GO:1901363", "GO:0003676", "GO:0003723", "GO:0006139"
)), AACS = structure(list(x = c(0.125, 0.02173913, 0.07065217, 
0.03804348, 0.01630435, 0.0326087), go = c("GO:0008152", "GO:0044238", 
"GO:0071704", "GO:0003824", "GO:0016405", "GO:0016874")), class = "data.frame", row.names = c("GO:0008152", 
"GO:0044238", "GO:0071704", "GO:0003824", "GO:0016405", "GO:0016874"
)), AARS2 = structure(list(x = c(0.06930693, 0.27722772, 0.01980198, 
0.04950495, 0.02970297, 0.03960396), go = c("GO:0000166", "GO:0005488", 
"GO:0008144", "GO:0017076", "GO:0030554", "GO:0032553")), class = "data.frame", row.names = c("GO:0000166", 
"GO:0005488", "GO:0008144", "GO:0017076", "GO:0030554", "GO:0032553"
)), AATK = structure(list(x = c(0.10769231, 0.27692308, 0.03076923, 
0.07692308, 0.04615385, 0.06153846), go = c("GO:0000166", "GO:0005488", 
"GO:0008144", "GO:0017076", "GO:0030554", "GO:0032553")), class = "data.frame", row.names = c("GO:0000166", 
"GO:0005488", "GO:0008144", "GO:0017076", "GO:0030554", "GO:0032553"
)), ABAT = structure(list(x = c(0.054644809, 0.008196721, 0.008196721, 
0.010928962, 0.013661202, 0.005464481), go = c("GO:0005488", 
"GO:0008144", "GO:0019842", "GO:0036094", "GO:0043167", "GO:0043168"
)), class = "data.frame", row.names = c("GO:0005488", "GO:0008144", 
"GO:0019842", "GO:0036094", "GO:0043167", "GO:0043168"))) 
完成后,我们将创建一个列表,用所有基因标识符分配单个数据帧,然后与原始列表连接:

#Feed unique elements to genes list
single <- list(df)
genes2Vecs2 <- c(single,genes2Vecs)
输出:

           go       A1BG       A1CF       AACS      AARS2       AATK        ABAT
1  GO:0000166         NA         NA         NA 0.06930693 0.10769231          NA
2  GO:0003676         NA 0.05555556         NA         NA         NA          NA
3  GO:0003723         NA 0.04166667         NA         NA         NA          NA
4  GO:0003824         NA         NA 0.03804348         NA         NA          NA
5  GO:0005488         NA 0.11111111         NA 0.27722772 0.27692308 0.054644809
6  GO:0005576 0.13793103         NA         NA         NA         NA          NA
7  GO:0005615 0.05172414         NA         NA         NA         NA          NA
8  GO:0006139         NA 0.13888889         NA         NA         NA          NA
9  GO:0008144         NA         NA         NA 0.01980198 0.03076923 0.008196721
10 GO:0008152         NA         NA 0.12500000         NA         NA          NA
11 GO:0016405         NA         NA 0.01630435         NA         NA          NA
12 GO:0016874         NA         NA 0.03260870         NA         NA          NA
13 GO:0017076         NA         NA         NA 0.04950495 0.07692308          NA
14 GO:0019842         NA         NA         NA         NA         NA 0.008196721
15 GO:0030554         NA         NA         NA 0.02970297 0.04615385          NA
16 GO:0031982 0.24137931         NA         NA         NA         NA          NA
17 GO:0032553         NA         NA         NA 0.03960396 0.06153846          NA
18 GO:0036094         NA         NA         NA         NA         NA 0.010928962
19 GO:0043167         NA         NA         NA         NA         NA 0.013661202
20 GO:0043168         NA         NA         NA         NA         NA 0.005464481
21 GO:0043227 0.25862069         NA         NA         NA         NA          NA
22 GO:0043230 0.05172414         NA         NA         NA         NA          NA
23 GO:0044238         NA         NA 0.02173913         NA         NA          NA
24 GO:0071704         NA         NA 0.07065217         NA         NA          NA
25 GO:0097159         NA 0.06944444         NA         NA         NA          NA
26 GO:1901363         NA 0.06944444         NA         NA         NA          NA
27 GO:1903561 0.03448276         NA         NA         NA         NA          NA

我怀疑这样做会奏效。只需将这些表堆叠起来,然后将它们转换成一种广泛的格式

library(tidyr)
图书馆(dplyr)
genes2Vecs%>%
绑定行(.id=“gene”)%>%
pivot_加宽(“go”,名称来自“gene”,值来自“x”)%>%
安排(去)
由于您没有提供,我不能给您真正的代码,但您可以这样做:首先在列表上循环,并添加一个具有列表元素名称的新列。然后使用
dplyr::bind_rows
data.table::rbindlist
绑定所有数据集。最后,使用
tidyr::pivot\u wide
data.table::dcast
将数据从长到宽进行转换。
#Change the names of x variable
for(i in 1:length(genes2Vecs))
{
  names(genes2Vecs[[i]])[1] <- names(genes2Vecs[i])
}
#Feed unique elements to genes list
single <- list(df)
genes2Vecs2 <- c(single,genes2Vecs)
#Now Merge
genes <- Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = "go", all.x = TRUE), 
                genes2Vecs2,accumulate = F)
           go       A1BG       A1CF       AACS      AARS2       AATK        ABAT
1  GO:0000166         NA         NA         NA 0.06930693 0.10769231          NA
2  GO:0003676         NA 0.05555556         NA         NA         NA          NA
3  GO:0003723         NA 0.04166667         NA         NA         NA          NA
4  GO:0003824         NA         NA 0.03804348         NA         NA          NA
5  GO:0005488         NA 0.11111111         NA 0.27722772 0.27692308 0.054644809
6  GO:0005576 0.13793103         NA         NA         NA         NA          NA
7  GO:0005615 0.05172414         NA         NA         NA         NA          NA
8  GO:0006139         NA 0.13888889         NA         NA         NA          NA
9  GO:0008144         NA         NA         NA 0.01980198 0.03076923 0.008196721
10 GO:0008152         NA         NA 0.12500000         NA         NA          NA
11 GO:0016405         NA         NA 0.01630435         NA         NA          NA
12 GO:0016874         NA         NA 0.03260870         NA         NA          NA
13 GO:0017076         NA         NA         NA 0.04950495 0.07692308          NA
14 GO:0019842         NA         NA         NA         NA         NA 0.008196721
15 GO:0030554         NA         NA         NA 0.02970297 0.04615385          NA
16 GO:0031982 0.24137931         NA         NA         NA         NA          NA
17 GO:0032553         NA         NA         NA 0.03960396 0.06153846          NA
18 GO:0036094         NA         NA         NA         NA         NA 0.010928962
19 GO:0043167         NA         NA         NA         NA         NA 0.013661202
20 GO:0043168         NA         NA         NA         NA         NA 0.005464481
21 GO:0043227 0.25862069         NA         NA         NA         NA          NA
22 GO:0043230 0.05172414         NA         NA         NA         NA          NA
23 GO:0044238         NA         NA 0.02173913         NA         NA          NA
24 GO:0071704         NA         NA 0.07065217         NA         NA          NA
25 GO:0097159         NA 0.06944444         NA         NA         NA          NA
26 GO:1901363         NA 0.06944444         NA         NA         NA          NA
27 GO:1903561 0.03448276         NA         NA         NA         NA          NA