R如何累计汇总到条件,包括条件发生变化的行
尝试为每一行指定一个连续值,直到满足条件为止,包括该行。 例如,对于以下样品:R如何累计汇总到条件,包括条件发生变化的行,r,R,尝试为每一行指定一个连续值,直到满足条件为止,包括该行。 例如,对于以下样品: a b FALSE 30.53 FALSE 27.80 FALSE 26.93 TRUE 41.66 FALSE 2.86 FALSE 16.31 TRUE 40.19 我想创建一个额外的列,对值进行计数,直到a变为TRUE(包括该行),然后再重置为0,并对b列中的值进行汇总,以便: a b c d FALSE 30.53 1 30.53 FALSE 27.80 2 58.33 FALSE 2
a b
FALSE 30.53
FALSE 27.80
FALSE 26.93
TRUE 41.66
FALSE 2.86
FALSE 16.31
TRUE 40.19
我想创建一个额外的列,对值进行计数,直到a变为TRUE(包括该行),然后再重置为0,并对b列中的值进行汇总,以便:
a b c d
FALSE 30.53 1 30.53
FALSE 27.80 2 58.33
FALSE 26.93 3 85.26
TRUE 41.66 4 126.92
FALSE 2.86 1 2.86
FALSE 16.31 2 19.17
TRUE 40.19 3 59.36
我试过使用
setDT(temp)[,c:=seq_len(.N), by=.(cumsum(a == TRUE))]
但结果是:
a b c
FALSE 30.53 1
FALSE 27.80 2
FALSE 26.93 3
TRUE 41.66 1
FALSE 2.86 2
FALSE 16.31 3
TRUE 40.19 1
如果有更好的方法,我们可以基于逻辑列创建一个分组列,方法是获取累计和并获得该输出的
滞后
,然后在列“b”上执行累计
library(dplyr)
df1 %>%
group_by(grp = lag(cumsum(a), default = 0)) %>%
mutate(c = row_number(), d = cumsum(b)) %>%
ungroup %>%
select(-grp)
-输出
# A tibble: 7 x 4
# a b c d
# <lgl> <dbl> <int> <dbl>
#1 FALSE 30.5 1 30.5
#2 FALSE 27.8 2 58.3
#3 FALSE 26.9 3 85.3
#4 TRUE 41.7 4 127.
#5 FALSE 2.86 1 2.86
#6 FALSE 16.3 2 19.2
#7 TRUE 40.2 3 59.4
数据
df1我们可以基于逻辑列创建一个分组列,方法是获取该输出的累积和并获得该输出的lag
,然后在列“b”上执行cumsum
library(dplyr)
df1 %>%
group_by(grp = lag(cumsum(a), default = 0)) %>%
mutate(c = row_number(), d = cumsum(b)) %>%
ungroup %>%
select(-grp)
-输出
# A tibble: 7 x 4
# a b c d
# <lgl> <dbl> <int> <dbl>
#1 FALSE 30.5 1 30.5
#2 FALSE 27.8 2 58.3
#3 FALSE 26.9 3 85.3
#4 TRUE 41.7 4 127.
#5 FALSE 2.86 1 2.86
#6 FALSE 16.3 2 19.2
#7 TRUE 40.2 3 59.4
数据
df1使用data.table
您可以使用a
值的cumsum
创建一个组列,并为每个组创建两个新列,一个列的行号为b
library(data.table)
setDT(temp)[,c('c', 'd') := .(seq_len(.N), cumsum(b)),shift(cumsum(a), fill = 0)]
temp
# a b c d
#1: FALSE 30.53 1 30.53
#2: FALSE 27.80 2 58.33
#3: FALSE 26.93 3 85.26
#4: TRUE 41.66 4 126.92
#5: FALSE 2.86 1 2.86
#6: FALSE 16.31 2 19.17
#7: TRUE 40.19 3 59.36
使用data.table
您可以使用a
值的cumsum
创建一个组列,并为每个组创建两个新列,一个列的行号为b
library(data.table)
setDT(temp)[,c('c', 'd') := .(seq_len(.N), cumsum(b)),shift(cumsum(a), fill = 0)]
temp
# a b c d
#1: FALSE 30.53 1 30.53
#2: FALSE 27.80 2 58.33
#3: FALSE 26.93 3 85.26
#4: TRUE 41.66 4 126.92
#5: FALSE 2.86 1 2.86
#6: FALSE 16.31 2 19.17
#7: TRUE 40.19 3 59.36
嗯,似乎最终结果不包括逻辑条件作为序列的一部分发生变化的行号?也就是说,当我运行上面的代码片段时,我看到上面示例中的c列结果是1 2 3 1 2 3 1,而不是1 2 3 4 1 23@kingp23请检查我的输出posted@kingp23您能再次检查我的解决方案吗?没有看到输出,抱歉!Data.table解决方案正是我想要的,谢谢!嗯,似乎最终结果不包括逻辑条件作为序列的一部分发生变化的行号?也就是说,当我运行上面的代码片段时,我看到上面示例中的c列结果是1 2 3 1 2 3 1,而不是1 2 3 4 1 23@kingp23请检查我的输出posted@kingp23您能再次检查我的解决方案吗?没有看到输出,抱歉!Data.table解决方案正是我想要的,谢谢!非常感谢。正是我要找的!非常感谢。正是我要找的!