根据另一列中的值创建一个计数连续变量

时间:2019-10-10 00:58:25

标签: r

嗨,我有类似的东西:

df<-data.frame(group=c(1, 1, 1, 1, 2, 2, 2,3,3,3,4,4,4), 
               number=c(0,1,1,1,1,1,0,1,0,1,0,1,1))

我希望我的“想要”计算每个“组”重复“次数” = 1的次数。然后,我想要它重复的最大次数(want2)。我想在'number'= 0时将'want'重置为1:

dfwant<-data.frame(group=c(1, 1, 1, 1, 2, 2, 2,3,3,3,4,4,4), 
               number=c(0,1,1,1,1,1,0,1,0,1,0,1,1),
               want=c(1,1,2,3,1,2,1,1,1,1,1,1,2),
               want2=c(3,3,3,3,2,2,2,1,1,1,2,2,2))

谢谢!

3 个答案:

答案 0 :(得分:3)

由于我们想在number = 0时重置,因此我们group_by group并在数字为0时创建一个新组。然后,我们将{{1 }}在每个组中出现1,在want中出现cumsum

want2

答案 1 :(得分:2)

我们可以轻松地使用rleid中的rowiddata.table

library(dplyr)
library(data.table)
df %>%
   group_by(group) %>%
   mutate(want = rowid(rleid(number)), want1 = max(want))
# A tibble: 13 x 4
# Groups:   group [4]
#   group number  want want1
#   <dbl>  <dbl> <int> <int>
# 1     1      0     1     3
# 2     1      1     1     3
# 3     1      1     2     3
# 4     1      1     3     3
# 5     2      1     1     2
# 6     2      1     2     2
# 7     2      0     1     2
# 8     3      1     1     1
# 9     3      0     1     1
#10     3      1     1     1
#11     4      0     1     2
#12     4      1     1     2
#13     4      1     2     2

或使用data.table语法

library(data.table)
setDT(df)[, want := rowid(rleid(number)),.(group)][, want1 := max(want), group][]

答案 2 :(得分:1)

base 中,您可以使用ave获取每个组的cumsum,例如:

df$want  <- pmax(1, ave(df$number, df$group, cumsum(df$number==0), FUN=cumsum))
df$want2 <- ave(df$want, df$group, FUN=max)
identical(df, dfwant)
#[1] TRUE

要在df$number==0时重置,可以使用cumsum(df$number==0)作为ave的附加分组,如@ Ronak-Shah所示。

如果df$number还拥有01以外的其他值,则必须使用:

df$want  <- pmax(1, ave(df$number==1, df$group, cumsum(df$number==0)
    , FUN=cumsum))