首页 > 解决方案 > 根据多列中以下行中的值更新行

问题描述

我有一个包含几千行的数据框,并选择了 2 列,例如:

col1  col2
2     11
3     11
4     12
4     1
5     1
6     2
1     3
1     3
2     4

在每列中的某个点重置为 1,然后在再次重置之前继续累积到某个值。每列中的重置点相互独立。我需要的是一个检测重置并在重置之前使用从 -1 到 -3 的负值更新值的函数 - 每一列取决于它自己的重置。所以需要的结果是:

col1  col2
2     -3
3     -2
4     -1
-3     1
-2     1
-1     2
1     3
1     3
2     4

任何建议如何做到这一点?(Dplyr 解决方案将是最受欢迎的)。

标签: rdplyr

解决方案


另一个基础 R 解决方案:

mydf[] <- lapply(mydf, function(x) {
  w <- which(x == 1 & c(0, head(x,-1)) != 1)
  x[c(sapply(w, `-`, 3:1))] <- -3:-1
  x
})

这使:

> mydf
  col1 col2
1    2   -3
2    3   -2
3    4   -1
4   -3    1
5   -2    1
6   -1    2
7    1    3
8    1    3
9    2    4

老答案:

mydf[] <- lapply(mydf, function(x) {
  w <- which(x == 1)
  i <- c(0, diff(w)) != 1
  w <- c(sapply(w[i], `-`, 3:1))
  x[w] <- -3:-1
  x
})

推荐阅读