r - 将行数计数为特定值(并反向计数)
解决方案
这是一个选项rle
:
df <- data.frame(x1 = c(rep(0, 3), rep(1, 4), rep(0, 4)))
df$x2 <- unlist(with(rle(df$x1), mapply(function(x, y)
if(x == 0) rev(-seq(y)) else seq(y) - 1, values, lengths)))
df
# x1 x2
#1 0 -3
#2 0 -2
#3 0 -1
#4 1 0
#5 1 1
#6 1 2
#7 1 3
#8 0 -4
#9 0 -3
#10 0 -2
#11 0 -1
这也可以在以下帮助下编写ave
:
df$x2 <- ave(df$x1, data.table::rleid(df$x1), FUN = function(x)
if(x[1] == 0) rev(-seq_along(x)) else seq_along(x) - 1)
两个代码的逻辑是一样的。我们创建连续 0 和 1 值的组,如果组值为 0,则创建从 1 到组长度的序列,使其为负并反转值。如果组值为 1,则创建一个从 0 到组长度 - 1 的序列。
推荐阅读
- node.js - 如何在多个 AWS lambda 中使用外部 Auth 令牌
- ruby-on-rails - 模型之间的关系是正确的,但控制器找不到任何记录?
- azure-aks - 从气流到 Azure Fileshare 的事务过多
- qt - Qt ActiveX 和 OneNote(桌面 2016 32 位)
- teamcity - 使用变量作为 TeamCity 属性的名称
- laravel - Laravel 分页减少链接数量
- pandas - 如何针对一个组重置索引?
- jquery - Jquery - 在 mouseenter / mouseleave 上缓和过渡
- websocket - 如何将 Cowboy (Erlang) websocket 连接到 webflow.io 生成的网页
- python - Economy Bot | discord.py rewrite | Leaderboard error - AttributeError: 'NoneType' object has no attribute 'name'