我经常阅读并经过多次测试但没有成功。我正在寻找每个组创建一个计数器,但是这个coutner每次出现一个组时都会重新启动(即使它“重新出现”)。
例:
我需要一个seq_along ……
这是一个选项 data.table 。将'data.frame'转换为'data.table'( setDT(df1) ),按'TYPE_OF_PROMOTION'的run-length-id分组,创建行序列( seq_len(.N) )乘以那些人 NA 在'TYPE_OF_PROMOTION'中创建'计数器'列
data.table
setDT(df1)
seq_len(.N)
NA
library(data.table) setDT(df1)[, counter2 := seq_len(.N) * NA^is.na(TYPE_OF_PROMOTION), by = rleid(TYPE_OF_PROMOTION)] df1 # Week TYPE_OF_PROMOTION counter counter2 # 1: 11 <NA> NA NA # 2: 12 B 1 1 # 3: 13 B 2 2 # 4: 14 B 3 3 # 5: 15 <NA> NA NA # 6: 16 <NA> NA NA # 7: 17 <NA> NA NA # 8: 18 B 1 1 # 9: 19 B 2 2 #10: 20 <NA> NA NA
或者 dplyr 利用 rleid 从 data.table
dplyr
rleid
library(dplyr) df1 %>% group_by(grp = rleid(TYPE_OF_PROMOTION)) %>% mutate(counter2 = case_when(is.na(TYPE_OF_PROMOTION) ~ NA_integer_, TRUE ~ row_number())) %>% ungroup %>% select(-grp)
或使用 base R 同 rle
base R
rle
with(df1, with(rle(!is.na(TYPE_OF_PROMOTION)), sequence(lengths) * rep(NA^!values, lengths))) #[1] NA 1 2 3 NA NA NA 1 2 NA
df1 <- structure(list(Week = 11:20, TYPE_OF_PROMOTION = c(NA, "B", "B", "B", NA, NA, NA, "B", "B", NA), counter = c(NA, 1L, 2L, 3L, NA, NA, NA, 1L, 2L, NA)), class = "data.frame", row.names = c("11", "12", "13", "14", "15", "16", "17", "18", "19", "20"))