【问题标题】:difference of values in different columns in consecutive rows连续行中不同列的值的差异
【发布时间】:2014-09-23 14:49:37
【问题描述】:

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

我尝试减去每对连续的行 第 (i+1) 行中第 2 列的值 来自第 (1) 行中第 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 的初学者

【问题讨论】:

  • 改用函数diff()
  • 我认为 diff() 只给了我一列中连续行的差异。你能告诉我怎么做吗?
  • 问题是您一次将差异分配给所有行,因为您也忘记了索引diff 变量。将df$diff替换为df$diff[i],它应该可以工作
  • 非常感谢。你能把这个放在答案中以便我投票吗?

标签: r


【解决方案1】:

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

例如:

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的最后一个元素,然后取向量差。

【讨论】:

    【解决方案2】:

    问题是您一次将差异分配给所有行,因为您也忘记索引 diff 变量。

    df$diff 替换为df$diff[i],它应该可以工作。

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

    【讨论】:

      猜你喜欢
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多