R 标记每个组中最后一个元素的列的组索引
我正在尝试子集一个数据帧。数据帧将被分解为子集,其中每个子集中的最后一个元素在“bool”列中有一个“TRUE”值。考虑下面的数据帧: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
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)都是一样的。@RichardScrivenbool
对每个组中的最后一个元素都是正确的,就像约瑟伯说的那样-但是他们删除了它,我也删除了我的,所以-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