Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R如何累计汇总到条件,包括条件发生变化的行_R - Fatal编程技术网

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解决方案正是我想要的,谢谢!非常感谢。正是我要找的!非常感谢。正是我要找的!