Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:按组外观重新启动计数器_R_Group By_Restart - Fatal编程技术网

R:按组外观重新启动计数器

R:按组外观重新启动计数器,r,group-by,restart,R,Group By,Restart,我读了很多书,做了很多测试,但是没有成功。 我希望为每个组创建一个计数器,但每次组出现时(即使它“重新出现”)都可以重新启动计数器 例如: 我需要一个seq_以及每个类型的提升,每个组出现时重新启动。 结果应该类似于计数器 因为宣传片B在第18周重新出现,但是一个新的外观-重新启动计数器 如果该解决方案也适用于NAs-好的,我只是做了一个快速演示 Week TYPE_OF_PROMOTION counter 11 11 <NA> NA 1

我读了很多书,做了很多测试,但是没有成功。 我希望为每个组创建一个计数器,但每次组出现时(即使它“重新出现”)都可以重新启动计数器

例如:

我需要一个seq_以及每个
类型的提升
,每个组出现时重新启动。 结果应该类似于
计数器
因为宣传片B在第18周重新出现,但是一个新的外观-重新启动计数器

如果该解决方案也适用于NAs-好的,我只是做了一个快速演示

   Week TYPE_OF_PROMOTION counter
11   11              <NA>      NA
12   12                 B       1
13   13                 B       2
14   14                 B       3
15   15              <NA>      NA
16   16              <NA>      NA
17   17              <NA>      NA
18   18                 B       1
19   19                 B       2
20   20              <NA>      NA
促销计数器的周类型 11不适用 12 B 1 13 B 2 14 B 3 15 NA 16北美 17 NA 18 B 1 19 B 2 20 NA
这里有一个带有
数据表的选项。将“data.frame”转换为“data.table”(
setDT(df1)
),按“TYPE\u of\u PROMOTION”的游程长度id分组,创建行序列(
seq\u len(.N)
)乘以“TYPE\u of\u PROMOTION”中的
NA
,以创建“counter”列

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

或者使用
baser
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刚刚离开,好奇的是它是否可以在数据之外完成。table…@Bullzeye。是的,这是可以做到的,你的意思是
base R
@Bullzeye包括
base R
dplyr
基于解决方案标记为“答案”-非常感谢!!
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"))