r - R中的增量指示符列
问题描述
我有以下数据,我正在尝试创建一个指标列来跟踪 id 值的增量。
df <- data.frame(id=c(1,1,1,1,1,1,1,2,2,2,3,3,4),
rank=c(1,2,3,1,1,1,2,2,3,1,1,2,3),dates=c('2019-06-15','2019-07-15','2019-08-15','2019-09-15','2019-10-15','2019-11-15','2019-12-15',
'2019-10-15','2019-11-15','2019-12-15',
'2019-11-15','2019-12-15','2019-12-15'),new_col=c(0,1,1,1,1,1,1,0,1,1,0,1,0)
)
日期的顺序在这里很重要。
setDT(df)[order(id,dates),]
期望的输出
id rank dates new_col
1 1 1 2019-06-15 0
2 1 2 2019-07-15 1
3 1 3 2019-08-15 1
4 1 1 2019-09-15 1
5 1 1 2019-10-15 1
6 1 1 2019-11-15 1
7 1 2 2019-12-15 1
8 2 2 2019-10-15 0
9 2 3 2019-11-15 1
10 2 1 2019-12-15 1
11 3 1 2019-11-15 0
12 3 2 2019-12-15 1
13 4 3 2019-12-15 0
更新的输入数据-
df <- data.frame(id=c(1,1,1,1,1,1,1,2,2,2,3,3,4,5,5,5),
rank=c(1,2,3,1,1,1,2,2,3,1,1,2,3,1,1,1),dates=c('2019-06-15','2019-07-10','2019-08-15','2019-09-15','2019-10-15','2019-11-15','2019-12-15',
'2019-10-15','2019-11-15','2019-12-15',
'2019-11-15','2019-12-15','2019-12-15','2019-10-15','2019-11-15','2019-12-15'))
更新输出-
id rank dates new
1 1 1 2019-06-15 0
2 1 2 2019-07-10 1
3 1 3 2019-08-15 1
4 1 1 2019-09-15 1
5 1 1 2019-10-15 1
6 1 1 2019-11-15 1
7 1 2 2019-12-15 1
8 2 2 2019-10-15 0
9 2 3 2019-11-15 1
10 2 1 2019-12-15 1
11 3 1 2019-11-15 0
12 3 2 2019-12-15 1
13 4 3 2019-12-15 0
14 5 1 2019-10-15 0
15 5 1 2019-11-15 0
16 5 1 2019-12-15 0
解决方案
我们可以 diff
在按“id”分组后在“日期”上使用
library(dplyr)
df %>%
group_by(id) %>%
mutate(new = c(0, diff(as.Date(dates)) > 0))
# A tibble: 13 x 5
# Groups: id [4]
# id rank dates new_col new
# <dbl> <dbl> <fct> <dbl> <dbl>
# 1 1 1 2019-06-15 0 0
# 2 1 2 2019-07-15 1 1
# 3 1 3 2019-08-15 1 1
# 4 1 1 2019-09-15 1 1
# 5 1 1 2019-10-15 1 1
# 6 1 1 2019-11-15 1 1
# 7 1 2 2019-12-15 1 1
# 8 2 2 2019-10-15 0 0
# 9 2 3 2019-11-15 1 1
#10 2 1 2019-12-15 1 1
#11 3 1 2019-11-15 0 0
#12 3 2 2019-12-15 1 1
#13 4 3 2019-12-15 0 0
更新
df %>%
group_by(id) %>%
mutate(new = +(c(FALSE, diff(as.Date(dates)) > 0) &
(any(rank != lag(rank, default = first(rank))))))
# A tibble: 16 x 4
# Groups: id [5]
# id rank dates new
# <dbl> <dbl> <fct> <int>
# 1 1 1 2019-06-15 0
# 2 1 2 2019-07-10 1
# 3 1 3 2019-08-15 1
# 4 1 1 2019-09-15 1
# 5 1 1 2019-10-15 1
# 6 1 1 2019-11-15 1
# 7 1 2 2019-12-15 1
# 8 2 2 2019-10-15 0
# 9 2 3 2019-11-15 1
#10 2 1 2019-12-15 1
#11 3 1 2019-11-15 0
#12 3 2 2019-12-15 1
#13 4 3 2019-12-15 0
#14 5 1 2019-10-15 0
#15 5 1 2019-11-15 0
#16 5 1 2019-12-15 0
推荐阅读
- mysql - mysql覆盖单表权限
- java - 如何使用 Visual Studio Code 在 Java .class 中实例化一个类?
- javascript - 自动完成功能不适用于 Prestashop 1.6 自定义模块
- excel - 为什么在不可预知的实例上执行 .Copy 方法后我的 VBA 代码会终止?
- python-3.x - Sigmoid 激活函数:ValueError 数据类型不准确/RuntimeWarning:exp 中遇到溢出
- magento-2.3 - 当我们在 Magento 2 中启用页面缓存的情况下使用 Redis 时,菜单消失
- python - 这是过拟合的情况吗?不稳定的验证损失并且不减少
- php - json_decode:来自 HEREDOC 字符串的有效 JSON 的“语法错误”
- playframework - 如何在生产中服务新的公共资产?
- ruby-on-rails - 无法解析创建方法中的参数(文件上传)