dplyr group_by和mutate,如何访问数据框?

时间:2016-04-11 14:34:18

标签: r group-by dplyr

使用dplyr" group_by"和#34; mutate",如果我理解正确,数据帧根据group_by参数分成不同的子数据帧。例如,使用以下代码:

 set.seed(7)
 df <- data.frame(x=runif(10),let=rep(letters[1:5],each=2))
 df %>% group_by(let) %>% mutate(mean.by.letter = mean(x))

mean()连续应用于5个sub-dfs的列x,对应于&amp;之间的字母。即

所以你可以操纵sub-dfs的列,但是你可以自己访问sub-dfs吗?令我惊讶的是,如果我尝试:

 set.seed(7)
 data <- data.frame(x=runif(10),let=rep(letters[1:5],each=2))
 data %>% group_by(let) %>% mutate(mean.by.letter = mean(.$x))

结果不同。从这个结果,人们可以推断出&#34;。&#34; df并不代表sub-dfs,而只是&#34;数据&#34;一个(group_by函数doens&t; t更改任何东西) 原因是我想使用一个stat函数,它将数据帧作为每个sub-dfs的参数。 谢谢!

2 个答案:

答案 0 :(得分:8)

我们可以在public class FifoMap extends LinkedHashMap<String, String> { int max; /** * */ private static final long serialVersionUID = 1L; public FifoMap (int max){ super(max + 1); this.max = max; } @Override public String put (String key, String value) { String forReturn = super.put(key, value); if (super.size() > max){ removeEldest(); } return forReturn; } private void removeEldest() { Iterator <String> iterator = this.keySet().iterator(); if (iterator.hasNext()){ this.remove(iterator.next()); } } }

中使用
do

答案 1 :(得分:1)

dplyr 0.8 起,您可以使用group_map,因此.调用中的group_map将代表sub-data.frame。

library(dplyr)
df %>%
  group_by(let ) %>% 
  group_map(~mutate(., mean.by.letter = mean(x)))
#> # A tibble: 10 x 3
#> # Groups:   let [5]
#>    let        x mean.by.letter
#>    <fct>  <dbl>          <dbl>
#>  1 a     0.989          0.693 
#>  2 a     0.398          0.693 
#>  3 b     0.116          0.0927
#>  4 b     0.0697         0.0927
#>  5 c     0.244          0.518 
#>  6 c     0.792          0.518 
#>  7 d     0.340          0.656 
#>  8 d     0.972          0.656 
#>  9 e     0.166          0.312 
#> 10 e     0.459          0.312

在此处查找有关group_map和其他新功能的更多信息:

https://www.tidyverse.org/articles/2019/02/dplyr-0-8-0/ https://www.tidyverse.org/articles/2018/12/dplyr-0-8-0-release-candidate/