我想要合并一系列数据框,按顺序对特定元素求和。对于背景,这些是基因组序列数据的单独分区文件,其沿着比对引用基因区域(将其视为字符串的部分)。我已将序列比对合并在一起,因此需要将分区文件合并在一起,同时保留分区相对位置。尽可能使其尽可能通用,以适应各个分区文件的任何数量和长度。
合并和总结需要像这样工作:
一个简单的例子可以更好地解释。
以下是区域1的数据框:
V1 V2 V3
Region_1_Partition_1 1 500
Region_1_Partition_2 501 1000
Region_1_Partition_3 1001 1500
这是第2区:
V1 V2 V3
Region_2_Partition_1 1 200
Region_2_Partition_2 201 400
Region_2_Partition_3 401 600
最终的分区文件必须是这样的:
V1 V2 V3
Region_1_Partition_1 1 500
Region_1_Partition_2 501 1000
Region_1_Partition_3 1001 1500
Region_2_Partition_1 1501 1700
Region_2_Partition_2 1701 1900
Region_2_Partition_3 1901 2001
我想到目前为止还有一些巧妙的解决方案让我望而却步!
由于 ç
答案 0 :(得分:1)
我会将“n”保留为列,以便您可以在最后一帧中cumsum()
。我不会通过merge
而是通过rbind()
首先“重新创建”您的数据
region1 <- data.frame(
label=c('Region_1_Partition_1', 'Region_1_Partition_2',
'Region_1_Partition_3'),
V4=500
)
region1$V3 <- cumsum(region1$V4)
region1$V2 <- region1$V3 - region1$V4 + 1
region1[, c('label', 'V2', 'V3')]
最后一个命令返回
label V2 V3
1: Region_1_Partition_1 1 500
2: Region_1_Partition_2 501 1000
3: Region_1_Partition_3 1001 1500
类似的代码,V4=200
可以给region2。
现在执行你的组合,
out <- rbind(region1[, c('label', 'V4')], region2[, c('label', 'V4')])
out$V3 <- cumsum(out$V4)
out$V2 <- out$V3 - out$V4 + 1
out[, c('label', 'V2', 'V3')]
label V2 V3
1: Region_1_Partition_1 1 500
2: Region_1_Partition_2 501 1000
3: Region_1_Partition_3 1001 1500
4: Region_2_Partition_1 1501 1700
5: Region_2_Partition_2 1701 1900
6: Region_2_Partition_3 1901 2100
另一个编辑:如何将解决方案扩展到更多数量的分区。
我可以在这里看到两个挑战,第一个是需要rbind()
所有内容,第二个是需要确定V4
列中的内容。
可能有一种更有效的R方式(比如将所有表存储在列表中然后将它们展平为一个表)。我只想使用for循环。
假设您在名为files
的向量中包含所有文件名。
out <- data.frame()
for (file in files) {
# read the file. prepend a path before this step if necessary
data <- read.csv(file)
# determine V4. This assumes that V3 is guaranteed to have a constant difference in any given file
# and that the first row is that difference, as in your example data
data$V4 <- data$V3[1]
data <- data[, c('V1', 'V4')] #note that I switched my first colname to match yours
out <- rbind(out, data)
}
# Recover V2 and V3
out$V3 <- cumsum(out$V4)
out$V2 <- out$V3 - out$V4 + 1
out[, c('V1', 'V2', 'V3')]
请注意,您的文件必须按顺序排列,否则cumsum()
将不正确。如果文件不符合规定,您可以在构建te out
表之后和使用cumsum()