R 标记每个组中最后一个元素的列的组索引

R 标记每个组中最后一个元素的列的组索引,r,R,我正在尝试子集一个数据帧。数据帧将被分解为子集,其中每个子集中的最后一个元素在“bool”列中有一个“TRUE”值。考虑下面的数据帧: df <- data.frame(c(3,1,3,4,1,1,4), rnorm(7)) df <- cbind(df, df[,1] != 1) names(df) <- c("ind", "var", "bool") df # ind var bool # 1 3 0.02343906 TRUE # 2 1

我正在尝试子集一个数据帧。数据帧将被分解为子集,其中每个子集中的最后一个元素在“bool”列中有一个“TRUE”值。考虑下面的数据帧:

df <- data.frame(c(3,1,3,4,1,1,4), rnorm(7))
df <- cbind(df, df[,1] != 1)
names(df) <- c("ind", "var", "bool")
df
#   ind         var  bool
# 1   3  0.02343906  TRUE
# 2   1  0.94786193 FALSE
# 3   3  0.50632766  TRUE
# 4   4  0.24655548  TRUE
# 5   1 -1.58103304 FALSE
# 6   1  0.73999468 FALSE
# 7   4  0.10929906  TRUE

我的第一个想法是使用
bool
列上的累积和(
cumsum
)来获得组索引——这将在
bool
值为
TRUE
时将索引值增加1:

df$index <- cumsum(df$bool)
df
#   ind        var  bool index
# 1   3 -1.0712125  TRUE     1
# 2   1  0.4994369 FALSE     1
# 3   3  2.1335274  TRUE     2
# 4   4 -1.5950432  TRUE     3
# 5   1  0.5919880 FALSE     3
# 6   1  2.7039831 FALSE     3
# 7   4 -1.3526646  TRUE     4

使用
子集,现在可以有效地将数据帧拆分为子集列表。为什么当bool列为FALSE TRUE时,第2行和第3行是子集?从5到7(F T)都是一样的。@RichardScriven
bool
对每个组中的最后一个元素都是正确的,就像约瑟伯说的那样-但是他们删除了它,我也删除了我的,所以-TRUE代表了一个组的结束。注意:)最终,我将用新创建的列对这个数据帧进行子集设置,如果答案将该帧拆分为没有新列的子集,我将接受该答案!
df$index <- cumsum(df$bool)
df
#   ind        var  bool index
# 1   3 -1.0712125  TRUE     1
# 2   1  0.4994369 FALSE     1
# 3   3  2.1335274  TRUE     2
# 4   4 -1.5950432  TRUE     3
# 5   1  0.5919880 FALSE     3
# 6   1  2.7039831 FALSE     3
# 7   4 -1.3526646  TRUE     4
df$index <- cumsum(df$bool) + !df$bool
df
#   ind        var  bool index
# 1   3 -1.0712125  TRUE     1
# 2   1  0.4994369 FALSE     2
# 3   3  2.1335274  TRUE     2
# 4   4 -1.5950432  TRUE     3
# 5   1  0.5919880 FALSE     4
# 6   1  2.7039831 FALSE     4
# 7   4 -1.3526646  TRUE     4