我有一个数千帧的数据框,并选择了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解决方案将是最受欢迎的).
另一个基础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)
这使:
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
老答案:
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)