r - 根据多列中以下行中的值更新行
问题描述
我有一个包含几千行的数据框,并选择了 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 解决方案将是最受欢迎的)。
解决方案
另一个基础 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
})
推荐阅读
- javascript - 使用 app.use('url','route_file') 对范围路由进行错误处理
- javascript - 我如何在 JavaScript 中使用 PHP 函数(Gutenberg WordPress)
- algorithm - 任意凸多边形中具有固定纵横比的最大对齐矩形?
- port - 来自互联网的端口转发工作不在同一网络内
- sql - 防止在 AWS Glue 中多次处理文件
- windows - 使用批处理脚本在多个文件上搜索文本,如果在其中找到文本,则重命名文件
- python - Pyinfra 缺少位置参数
- android - 以编程方式为 AnimatedVectorDrawable 和 Compat 设置持续时间和 startOffset
- javascript - 我不断收到 TypeError: Cannot read property 'find' of undefined
- python - 有没有办法使用模式匹配回调删除(修改)绘图破折号中的父元素?