R - 为由另一列分组的列中每次出现的值分配递增索引
R - Assign increasing index to every occurrence of a value in a column grouped by another column
我的数据是这样的:
Time| V1 | V2
T01 | A | 1
T02 | A | 1
T03 | A | 2
T04 | A | 2
T05 | A | 3
T06 | A | 3
T07 | A | 4
T08 | A | 4
T09 | A | 1
T10 | A | 1
T11 | A | 2
T12 | A | 2
T13 | A | 3
T14 | A | 3
T15 | A | 4
T16 | A | 4
每一行在 'Time' 列中都有一个唯一的时间戳。数据已经按此排序。我想创建一个新列,为 V2 分配一个递增的计数器,按 V1 分组。例如,V2中'1'第一次出现的所有行都应分配索引1。第二次出现'1'时,应分配索引2,依此类推......像这样:
Time| V1 | V2 | V3
T01 | A | 1 | 1
T02 | A | 1 | 1
T03 | A | 2 | 1
T04 | A | 2 | 1
T05 | A | 3 | 1
T06 | A | 3 | 1
T07 | A | 4 | 1
T08 | A | 4 | 1
T09 | A | 1 | 2
T10 | A | 1 | 2
T11 | A | 2 | 2
T12 | A | 2 | 2
T13 | A | 3 | 2
T14 | A | 3 | 2
T15 | A | 4 | 2
T16 | A | 4 | 2
V2 的索引应按 V1 分组。因此,如果 V1 中的值发生变化,V3 中 V2 值的索引应该重新开始。我该怎么做?
这是一个数据table解决方案:
library(data.table)
setDT(dd)
dd[, temp := rleid(V2), by = .(V1)][, result := as.integer(factor(temp)), by = V2]
dd
# V1 V2 V3 temp result
# 1: A 1 1 1 1
# 2: A 1 1 1 1
# 3: A 2 1 2 1
# 4: A 2 1 2 1
# 5: A 3 1 3 1
# 6: A 3 1 3 1
# 7: A 4 1 4 1
# 8: A 4 1 4 1
# 9: A 1 2 5 2
# 10: A 1 2 5 2
# 11: A 2 2 6 2
# 12: A 2 2 6 2
# 13: A 3 2 7 2
# 14: A 3 2 7 2
# 15: A 4 2 8 2
# 16: A 4 2 8 2
library(dplyr)
d %>%
group_by(V1) %>%
mutate(ind = with(rle(V2), rep(ave(values, values, FUN = seq_along), lengths)))
我的数据是这样的:
Time| V1 | V2
T01 | A | 1
T02 | A | 1
T03 | A | 2
T04 | A | 2
T05 | A | 3
T06 | A | 3
T07 | A | 4
T08 | A | 4
T09 | A | 1
T10 | A | 1
T11 | A | 2
T12 | A | 2
T13 | A | 3
T14 | A | 3
T15 | A | 4
T16 | A | 4
每一行在 'Time' 列中都有一个唯一的时间戳。数据已经按此排序。我想创建一个新列,为 V2 分配一个递增的计数器,按 V1 分组。例如,V2中'1'第一次出现的所有行都应分配索引1。第二次出现'1'时,应分配索引2,依此类推......像这样:
Time| V1 | V2 | V3
T01 | A | 1 | 1
T02 | A | 1 | 1
T03 | A | 2 | 1
T04 | A | 2 | 1
T05 | A | 3 | 1
T06 | A | 3 | 1
T07 | A | 4 | 1
T08 | A | 4 | 1
T09 | A | 1 | 2
T10 | A | 1 | 2
T11 | A | 2 | 2
T12 | A | 2 | 2
T13 | A | 3 | 2
T14 | A | 3 | 2
T15 | A | 4 | 2
T16 | A | 4 | 2
V2 的索引应按 V1 分组。因此,如果 V1 中的值发生变化,V3 中 V2 值的索引应该重新开始。我该怎么做?
这是一个数据table解决方案:
library(data.table)
setDT(dd)
dd[, temp := rleid(V2), by = .(V1)][, result := as.integer(factor(temp)), by = V2]
dd
# V1 V2 V3 temp result
# 1: A 1 1 1 1
# 2: A 1 1 1 1
# 3: A 2 1 2 1
# 4: A 2 1 2 1
# 5: A 3 1 3 1
# 6: A 3 1 3 1
# 7: A 4 1 4 1
# 8: A 4 1 4 1
# 9: A 1 2 5 2
# 10: A 1 2 5 2
# 11: A 2 2 6 2
# 12: A 2 2 6 2
# 13: A 3 2 7 2
# 14: A 3 2 7 2
# 15: A 4 2 8 2
# 16: A 4 2 8 2
library(dplyr)
d %>%
group_by(V1) %>%
mutate(ind = with(rle(V2), rep(ave(values, values, FUN = seq_along), lengths)))