嗨,我有类似的东西:
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))
谢谢!
答案 0 :(得分:3)
由于我们想在number = 0
时重置,因此我们group_by
group
并在数字为0时创建一个新组。然后,我们将{{1 }}在每个组中出现1,在want
中出现cumsum
。
want2
答案 1 :(得分:2)
我们可以轻松地使用rleid
中的rowid
和data.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
还拥有0
和1
以外的其他值,则必须使用:
df$want <- pmax(1, ave(df$number==1, df$group, cumsum(df$number==0)
, FUN=cumsum))