r - 根据条件分组对行求和

标签 r dplyr

以前我asked与这个问题相关,但我需要更优雅和通用的方法来解决这个问题。 我将数据分成几组,我想根据条件对范围内的一些行求和。我更喜欢使用“dplyr”来执行此操作,因为它对我来说更容易理解。

我需要的条件如下;

1:第1组; 找到第一次出现的“10”,并将这次出现之后的行加到组的末尾,并计算有多少行。

2: 对于第 2 组;'找到最后一次出现的“10”,并将这次出现之前的行加到组的开头,并计算有多少行!

3:第3组;找到第一次出现的“10”,并将这次出现之前的行加到组的起始行,并计算有多少行。

df <- data.frame(gr=rep(c(1,2,3),c(7,9,11)), 
                 y_value=c(c(0,0,10,8,8,6,0),c(10,10,10,8,7,6,2,0,0), c(8,5,8,7,6,2,10,10,8,7,0)))


> df
   gr y_value
1   1       0
2   1       0
3   1      10
4   1       8
5   1       8
6   1       6
7   1       0
8   2      10
9   2      10
10  2      10
11  2       8
12  2       7
13  2       6
14  2       2
15  2       0
16  2       0
17  3       8
18  3       5
19  3       8
20  3       7
21  3       6
22  3       2
23  3      10
24  3      10
25  3       8
26  3       7
27  3       0    

它猜测这样的事情应该可行,但无法弄清楚如何将其实现到 dplyr

count <- function(y,gr){
    if (any(y==10)&(gr==1)) {
     *
     *
     *
if (any(y==10)&(gr==2)) 
 *
 *
 *
 *

}

df%>%
library(dplyr)

  df %>%
  group_by(gr) %>%
  do(data.frame(.,count_rows=count(y_value,gr)))

预期输出

  > df
    gr y_value sum nrow
1   1       0  22   4
2   1       0  22   4
3   1      10  22   4
4   1       8  22   4
5   1       8  22   4
6   1       6  22   4
7   1       0  22   4
8   2      10  23   6
9   2      10  23   6
10  2      10  23   6
11  2       8  23   6
12  2       7  23   6
13  2       6  23   6
14  2       2  23   6
15  2       0  23   6
16  2       0  23   6
17  3       8  28   6
18  3       5  28   6
19  3       7  28   6
20  3       6  28   6
21  3       2  28   6
22  3      10  28   6
23  3      10  28   6
24  3       8  28   6
25  3       7  28   6
26  3       0  28   6

最佳答案

希望对您有所帮助!

(编辑说明:在 OP 更新了他的原始需求后修改了代码)

#sample data - I slightly changed sample data (replaced 0 by 10 in 2nd row) for group 1 to satisfy your condition
df <- data.frame(gr=rep(c(1,2,3),c(7,9,11)), 
                 y_value=c(c(0,10,10,8,8,6,0),c(10,10,10,8,7,6,2,0,0), c(8,5,8,7,6,2,10,10,8,7,0)))

library(dplyr)
df_temp <- df %>% 
  group_by(gr) %>% 
  mutate(rows_to_aggregate=cumsum(y_value==10)) %>% 
  filter(ifelse(gr==1, rows_to_aggregate !=0, ifelse(gr==2, rows_to_aggregate ==0 | y_value==10, rows_to_aggregate ==0))) %>% 
  filter(ifelse(gr==1, row_number(gr) != 1, ifelse(gr==2, row_number(gr) != n(), rows_to_aggregate ==0))) %>% 
  mutate(nrow=n(), sum=sum(y_value)) %>%
  select(gr,sum,nrow) %>%
  distinct()

#final output
df<- left_join(df,df_temp, by='gr')

关于r - 根据条件分组对行求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46387680/

相关文章:

r - tidyr::expand() 用于跨组的单个列

r - 使用Tidyverse Join更新/替换数据框中的值

r - 基于列汇总变量的更快方法

r - left_join 表示列不存在,即使它存在

r - dbplyr 中 database.table 的语法?

r - Shiny:ProgressBar,用于将数据从数据库加载到数据表(DT)

R - 大数据 - 向量超出向量长度限制

r - 如何相对于彼此移动两个几何体的 x 轴位置

r - x[[jj]] <- v : attempt to select less than one element in integerOneIndex 中的错误

r - : Programming with dplyr 中的示例问题