连续行中不同列中的值的差异

时间:2014-09-23 14:49:38

标签: r

我有一个data.frame df,包含5列和大约10000行。

我尝试对每对连续行进行减法 行(i + 1)中第2列的值 从第(3)行第3列的值 并将结果写入名为'diff'

的新列中

df看起来像:

`  chr   start     end    TBX21 width 
1 chr1 4847746 4847778 53.37334    32
2 chr1 6204636 6204673 33.70947    37      
3 chr1 6457267 6457345 31.83673    78

`

我试过了: `

length = length(df[[1]])-1

for (i in 1:length) {
  df$diff = df[i+1, 2] - df[i,3];
}

` 我得到的是:

`chr   start     end    TBX21 width diff
1 chr1 4847746 4847778 53.37334    32      9229
2 chr1 6204636 6204673 33.70947    37      9229
3 chr1 6457267 6457345 31.83673    78      9229
4 chr1 7078778 7078822 39.32772    44      9229`

我无法理解我的错误。 是的我是R的初学者

2 个答案:

答案 0 :(得分:3)

您可以通过矢量化方式实现此目的,即不使用显式循环。

例如:

dat$diff <- c(NA, tail(dat$end, -1) - head(dat$start, -1))
dat

   chr   start     end    TBX21 width    diff
1 chr1 4847746 4847778 53.37334    32      NA
2 chr1 6204636 6204673 33.70947    37 1356927
3 chr1 6457267 6457345 31.83673    78  252709

单词:删除end的第一个元素和start的最后一个元素,然后取矢量差异。

答案 1 :(得分:1)

问题是你是在同时为所有行分配差异,因为你忘了为diff变量索引。

替换df$diff的{​​{1}},它应该有用。

但是,R中的显式循环并不总是最佳选择,特别是对于大型数据集。 @Andrie的答案以矢量化的方式很好地覆盖了它。如果你有一个小/中等大小的数据集,我会保持简单,因为它更容易阅读。