我正在寻找一种方法将一个(长)数据帧列表合并到一个数据帧中,方法是保留公共列并附加一个包含每个数据帧中不同值的列。
head(dflist[['sampleA']])
seqnames start end width strand gene reads
1 chr1 30366 30503 138 + hsa-mir-1302-2 7
2 chr1 1102484 1102578 95 + hsa-mir-200b 2158
3 chr1 1103243 1103332 90 + hsa-mir-200a 12939
4 chr1 1104385 1104467 83 + hsa-mir-429 2775
5 chr1 3044539 3044599 61 + hsa-mir-4251 0
6 chr1 3477259 3477354 96 - hsa-mir-551a 464
head(dflist[['sampleB']])
seqnames start end width strand gene reads
1 chr1 30366 30503 138 + hsa-mir-1302-2 6
2 chr1 1102484 1102578 95 + hsa-mir-200b 1407
3 chr1 1103243 1103332 90 + hsa-mir-200a 8874
4 chr1 1104385 1104467 83 + hsa-mir-429 1721
5 chr1 3044539 3044599 61 + hsa-mir-4251 0
6 chr1 3477259 3477354 96 - hsa-mir-551a 349
我想要的是这样的输出:
seqnames start end width strand gene reads.sampleA
1 chr1 30366 30503 138 + hsa-mir-1302-2 7
2 chr1 1102484 1102578 95 + hsa-mir-200b 2158
3 chr1 1103243 1103332 90 + hsa-mir-200a 12939
4 chr1 1104385 1104467 83 + hsa-mir-429 2775
5 chr1 3044539 3044599 61 + hsa-mir-4251 0
6 chr1 3477259 3477354 96 - hsa-mir-551a 464
reads.sampleB
1 6
2 1407
3 8874
4 1721
5 0
6 349
我非常确定这是一项相当简单和常见的任务,但我无法找到/谷歌这样做的方法。
答案 0 :(得分:3)
或者您可以尝试join_all
获取一长串data.frames
library(plyr)
join_all(dfList, by=names(dfList[[1]][-7]))
# seqnames start end width strand gene reads reads
#1 chr1 30366 30503 138 + hsa-mir-1302-2 7 6
#2 chr1 1102484 1102578 95 + hsa-mir-200b 2158 1407
#3 chr1 1103243 1103332 90 + hsa-mir-200a 12939 8874
#4 chr1 1104385 1104467 83 + hsa-mir-429 2775 1721
#5 chr1 3044539 3044599 61 + hsa-mir-4251 0 0
#6 chr1 3477259 3477354 96 - hsa-mir-551a 464 349
答案 1 :(得分:2)
这是一个简单的合并。默认情况下,合并函数会合并所有常用名称,但您希望合并除姓氏之外的所有名称,因此请将其从提供给by
的字符向量中删除:
merge(dflist[[1]], dflist[[2]], by=names(dflist[[1]][-7]) )
seqnames start end width strand gene reads.x reads.y
1 chr1 1102484 1102578 95 + hsa-mir-200b 2158 1407
2 chr1 1103243 1103332 90 + hsa-mir-200a 12939 8874
3 chr1 1104385 1104467 83 + hsa-mir-429 2775 1721
4 chr1 30366 30503 138 + hsa-mir-1302-2 7 6
5 chr1 3044539 3044599 61 + hsa-mir-4251 0 0
6 chr1 3477259 3477354 96 - hsa-mir-551a 464 349