我有一个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的初学者
答案 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的答案以矢量化的方式很好地覆盖了它。如果你有一个小/中等大小的数据集,我会保持简单,因为它更容易阅读。