使用dplyr折叠行

使用dplyr折叠行,r,group-by,dplyr,summarize,R,Group By,Dplyr,Summarize,我是R新手,正在尝试使用dplyr根据行值折叠行。下面的示例显示了示例数据 set.seed(123) df<-data.frame(A=c(rep(1:4,4)), B=runif(16,min=0,max=1), C=rnorm(16, mean=1,sd=0.5)) A B c 1 1 0.36647435 0.7485365 2 2 0.51864614 0.8654337 3 3 0.0

我是R新手,正在尝试使用dplyr根据行值折叠行。下面的示例显示了示例数据

set.seed(123)

df<-data.frame(A=c(rep(1:4,4)),
               B=runif(16,min=0,max=1),
               C=rnorm(16, mean=1,sd=0.5))

   A B          c
1  1 0.36647435 0.7485365
2  2 0.51864614 0.8654337
3  3 0.04596929 0.9858012
4  4 0.15479619 1.1294208
5  1 0.76712372 1.2460700
6  2 0.17666676 0.7402996
7  3 0.89759874 1.2699954
8  4 0.90267735 0.7101804
9  1 0.91744223 0.3451281
10 2 0.25472599 0.8604743
11 3 0.10933985 0.8696796
12 4 0.71656017 1.2648846
13 1 0.21157810 1.3170205
14 2 0.14947268 1.2789700
15 3 0.92251060 1.5696901
16 4 0.30090579 1.7642853
预期输出类似于:

   A    B           C
1  1.5  0.4425602   0.8069851
3  3    0.04596929  0.9858012
4  4    0.15479619  1.1294208
5  1.5  0.4718952   0.9931848
7  3    0.89759874  1.2699954
8  4    0.90267735  0.7101804
9  1.5  0.5860841   0.6028012
11 3    0.10933985  0.8696796
12 4    0.71656017  1.2648846
13 1.5  0.1805254   1.297995
15 3    0.92251060  1.5696901
16 4    0.30090579  1.7642853

提前感谢。

一个选项是将
A
等于1或2的行与其他行分开处理,然后将它们重新绑定在一起:

set.seed(3)
df<-data.frame(A=c(rep(1:4,4)),B=runif(16,min=0,max=1),c=rnorm(16, mean=1,sd=0.5))

df %>% 
  filter(A %in% 1:2) %>% 
  group_by(tmp=cumsum(A==1)) %>% 
  summarise_all(mean) %>% 
  ungroup %>% select(-tmp) %>% 
  bind_rows(df %>% filter(!A %in% 1:2))
set.seed(3)
df%
过滤器(A%在%1:2中)%>%
分组依据(tmp=cumsum(A==1))%>%
汇总所有(平均值)%>%
解组%>%选择(-tmp)%%>%
绑定_行(df%>%筛选器(!%1:2中的%A))
abc
1   1.5 0.4877790 1.0121278
2   1.5 0.6032474 0.8840735
3   1.5 0.6042946 0.5996850
4   1.5 0.5456424 0.6198039
5   3.0 0.3849424 0.6276092
6   4.0 0.3277343 0.4343907
7   3.0 0.1246334 1.0760229
8   4.0 0.2946009 0.8461718
9   3.0 0.5120159 1.6121568
10   4.0 0.5050239 1.0999058
11   3.0 0.8679195 0.8981359
12   4.0 0.8297087 0.1667626

通过使隐式的、基于顺序的分组显式化,汇总可以 只需一次
总结所有
通话即可完成

#生成数据
种子(1)
df%
分组方式为(平均值=cumsum(A>2)+1,相加=T)%>%
汇总所有(平均值)%>%
解组()
新的
#>#tibble:12 x 5
#>grp平均值\u grp A B C
#>                     
#>  1     1        1   1.5 0.3188163 1.067598241
#>  2     1        2   3.0 0.5728534 1.755890584
#>  3     1        3   4.0 0.9082078 1.194921618
#>  4     2        1   1.5 0.5500358 0.291014883
#>  5     2        2   3.0 0.9446753 1.562465459
#>  6     2        3   4.0 0.6607978 0.977533195
#>  7     3        1   1.5 0.3454502 1.231911487
#>  8     3        2   3.0 0.2059746 1.410610598
#>  9     3        3   4.0 0.1765568 1.296950661
#> 10     4        1   1.5 0.5355633 1.425278418
#> 11     4        2   3.0 0.7698414 1.037282492
#> 12     4        3   4.0 0.4976992 0.005324152
我建议将分组变量保存在 总结(如果你把它们放在第一位,一切都会变得简单), 但是如果你想,你可以把它们扔了
new%>%选择(-grp,-mean\u grp)


注:为了避免代码中包含(例如创建
grp
时的
1:4
each=4
),您还可以创建第一个分组变量,如下所示:

grp=cumsum(A

假设对原始数据进行排序,每次
a
的值小于
a

的前一个值时,都会启动一个新组,这些行并没有完全折叠,而是以2乘2的方式折叠,您不必解释规则,在真实数据中,确实有这样的4行序列?@Moody_Mudskipper如果列A中的值为1和2,那么这些行将被折叠。在生成随机数据时,在示例中包含一个
set.seed()
调用会很有帮助。这样其他人就可以准确地复制您的结果!我读过这篇文章,但它似乎是按4人一组进行的,这是所选答案所采用的假设,但在你的问题中并不明确谢谢你@eipi10我想知道你如何保持行的顺序,以便行可以按递增顺序排列,如;1.5,3,4,1.5,3,4,1.5,3,4,1.5,3,4。我试图运行代码,但得到了以下错误消息:
mutate\u impl中的错误(.data,dots):错误的结果大小(64),预期为16或1
我不确定为什么在第一个
groupby
函数中需要
each=4
参数。我还试图通过省略
each=4
参数来运行代码,但输出没有排序。正如所料。你能解释一下吗?啊,那是个打字错误:一定是在做造型时忘了。您可以省略第一个
4
,但需要每个
将4个相邻行分组在一起。我做了相应的编辑。
set.seed(3)
df<-data.frame(A=c(rep(1:4,4)),B=runif(16,min=0,max=1),c=rnorm(16, mean=1,sd=0.5))

df %>% 
  filter(A %in% 1:2) %>% 
  group_by(tmp=cumsum(A==1)) %>% 
  summarise_all(mean) %>% 
  ungroup %>% select(-tmp) %>% 
  bind_rows(df %>% filter(!A %in% 1:2))
       A         B         c
   <dbl>     <dbl>     <dbl>
 1   1.5 0.4877790 1.0121278
 2   1.5 0.6032474 0.8840735
 3   1.5 0.6042946 0.5996850
 4   1.5 0.5456424 0.6198039
 5   3.0 0.3849424 0.6276092
 6   4.0 0.3277343 0.4343907
 7   3.0 0.1246334 1.0760229
 8   4.0 0.2946009 0.8461718
 9   3.0 0.5120159 1.6121568
10   4.0 0.5050239 1.0999058
11   3.0 0.8679195 0.8981359
12   4.0 0.8297087 0.1667626