r - 如果两个值相等,则将下一行中的值加 1
问题描述
我有这样的数据
structure(list(id = c(1, 1, 1, 2, 2, 2), time = c(1, 2, 2, 5,
6, 6)), class = "data.frame", row.names = c(NA, -6L))
如果对于相同的 ID,下一行中的值等于上一行中的值,则将副本的值增加 1。我想得到这个
structure(list(id2 = c(1, 1, 1, 2, 2, 2), time2 = c(1, 2, 3,
5, 6, 7)), class = "data.frame", row.names = c(NA, -6L))
解决方案
使用基础 R:
ave(df$time, df$time, FUN = function(z) z+cumsum(duplicated(z)))
# [1] 1 2 3 5 6 7
(这可以重新分配回time
。)
这处理2 个或更多重复项,这意味着如果我们有另一个第 6 行,
df <- rbind(df, df[6,])
df$time2 <- ave(df$time, df$time, FUN = function(z) z+cumsum(duplicated(z)))
df
# id time time2
# 1 1 1 1
# 2 1 2 2
# 3 1 2 3
# 4 2 5 5
# 5 2 6 6
# 6 2 6 7
# 61 2 6 8
推荐阅读
- django - Django 日期字段仅启用/突出显示某些日期
- excel - Excel 文件中的多个条件
- powershell - Powershell - 将文件递归复制到包含某些文本的单个文件夹中
- c - 如何在cgo中将golang字符串添加到ac struct
- command-line-interface - 程序如何使用一组参数,但也可以在管道中工作?
- node.js - 为 Azure Blob 的 Azure 共享访问令牌设置过期时间和其他访问权限
- python - 在以下代码中获取 KeyError 以查找“数字的最小平方”
- javascript - Barba.js:scrollRestoration 和 Wordpress 问题
- javascript - 无法在已解析的服务中注入依赖项
- scala - 通过 id 合并数据框中的行,试图避免列中的空值(Spark scala)