根据多列中以下行中的值更新行

Bar*_*z M 4 r dplyr

我有一个数千帧的数据框,并选择了2列,如:

col1  col2
2     11
3     11
4     12
4     1
5     1
6     2
1     3
1     3
2     4
Run Code Online (Sandbox Code Playgroud)

在每个列中,某些值的值重置为1,然后再次重置之前继续累积到某个值.每列中的重置点独立于另一列.我需要的是一个函数检测复位和更新值,在此复位之前,负值从-1到-3 - 对于每列,具体取决于它自己的复位.所以需要的结果是:

col1  col2
2     -3
3     -2
4     -1
-3     1
-2     1
-1     2
1     3
1     3
2     4
Run Code Online (Sandbox Code Playgroud)

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

Jaa*_*aap 5

另一个基础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
})
Run Code Online (Sandbox Code Playgroud)

这使:

> 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
Run Code Online (Sandbox Code Playgroud)

老答案:

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
})
Run Code Online (Sandbox Code Playgroud)