R合并数据帧顺序求和elemets - 棘手。

时间:2017-07-31 16:07:56

标签: r matrix merge

我想要合并一系列数据框,按顺序对特定元素求和。对于背景,这些是基因组序列数据的单独分区文件,其沿着比对引用基因区域(将其视为字符串的部分)。我已将序列比对合并在一起,因此需要将分区文件合并在一起,同时保留分区相对位置。尽可能使其尽可能通用,以适应各个分区文件的任何数量和长度。

合并和总结需要像这样工作:

  1. 第二列元素是前一行的第三列元素加一。
  2. 对于第一个数据框,第三列:第一个元素等于n,第二个元素等于2n,第三个元素是3n,依此类推。
  3. 在新合并的数据框中,第三列的第一个元素将成为其值(x)加上前一个数据帧中第三列的最后一个元素(x +?n)。然后将x添加到每行的x +?n,直到数据帧结束或合并新数据。
  4. 一个简单的例子可以更好地解释。

    以下是区域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
    

    我想到目前为止还有一些巧妙的解决方案让我望而却步!

    由于 ç

1 个答案:

答案 0 :(得分:1)

编辑:抱歉,我经常浏览data.table()具体问题,但没有注意到这个问题与数据框有关!相应地改变了我的答案

我会将“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()

之前对其进行重新排序