假设我有这些数据(按 ID、日期和值排序):
id value Date
---- -------- -----------
1 A 2018-03-07
1 A 2018-03-26
1 B 2018-04-01
1 B 2018-04-15
1 C 2018-05-07
1 A 2018-06-26
2 A 2018-03-07
2 A 2018-03-26
2 B 2018-04-01
2 C 2018-04-15
2 C 2018-05-07
2 B 2018-06-26
可以使用以下代码生成数据:
df <- as.data.frame(cbind(
id = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2),
value = c("A", "A", "B", "B", "C", "A", "A", "A", "B", "C", "C", "B"),
Date = c("2018-03-27", "2018-03-26", "2018-04-01", "2018-04-15", "2018-05-07", "2018-06-26","2018-03-27", "2018-03-26", "2018-04-01", "2018-04-15", "2018-05-07", "2018-06-26")
))
我想将每个 (N+1) 中的 value
列与同一 id
列中的 N 行进行比较,并添加一个新列来记录行号每一行。如果值
发生变化,则行号列会在当前数字的基础上加1,例如:
id value Date Row_Number
---- -------- ----------- -----------
1 A 2018-03-07 1
1 A 2018-03-26 1
1 B 2018-04-01 2
1 B 2018-04-15 2
1 C 2018-05-07 3
1 A 2018-06-26 4
2 A 2018-03-07 1
2 A 2018-03-26 1
2 B 2018-04-01 2
2 C 2018-04-15 3
2 C 2018-05-07 3
2 B 2018-06-26 4
最佳答案
您可以使用data.table::rleid
:
df %>%
group_by(id) %>%
mutate(rn = rleid(value))
# A tibble: 12 × 4
# Groups: id [2]
id value Date rn
<chr> <chr> <chr> <int>
1 1 A 2018-03-27 1
2 1 A 2018-03-26 1
3 1 B 2018-04-01 2
4 1 B 2018-04-15 2
5 1 C 2018-05-07 3
6 1 A 2018-06-26 4
7 2 A 2018-03-27 1
8 2 A 2018-03-26 1
9 2 B 2018-04-01 2
10 2 C 2018-04-15 3
11 2 C 2018-05-07 3
12 2 B 2018-06-26 4
关于Row_number 基于按 R 中其他列排序的多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74074679/