我有一个带有id变量和日期变量的简单数据集,并且想要创建一个计数器变量(计数器),只要id变量中的日期发生变化,它就会递增。假设数据按id和日期排序,并且特定日期可能在id内出现任意次数。这很容易在其他语言中完成(SAS使用retain或Stata with by:和_n / _N),但我还没有在R中找到一种非常有效的方法。
答案 0 :(得分:3)
我们可以尝试
library(dplyr)
df1 %>%
group_by(id) %>%
mutate(counter= cumsum(c(TRUE, date[-1]!=date[-n()])))
# id date counter
# (dbl) (chr) (int)
#1 1 a 1
#2 1 a 1
#3 1 b 2
#4 1 b 2
#5 2 a 1
#6 2 a 1
#7 2 b 2
df1 <- data.frame(id= rep(c(1,2), c(4,3)), date= c('a', 'a',
'b', 'b', 'a', 'a', 'b'), stringsAsFactors=FALSE)
答案 1 :(得分:1)
您还可以使用data.table
及其rleid
- 函数:
library(data.table)
dat <- data.table(id=rep(c(1,2),c(4,3)),
date=c('a','a','b','b','a','a','b'))
dat[,counter:=rleid(date),by=id]
dat
> dat
id date counter
1: 1 a 1
2: 1 a 1
3: 1 b 2
4: 1 b 2
5: 2 a 1
6: 2 a 1
7: 2 b 2