group_by
后如何对所有变量进行summarise(.data, "$var" = sum($var))
操作
先用r4ds的例子:
by_day <- group_by(flights, year, month, day)
summarise(by_day, delay = mean(dep_delay, na.rm = TRUE))
#> `summarise()` regrouping output by 'year', 'month' (override with `.groups` argument)
#> # A tibble: 365 x 4
#> # Groups: year, month [12]
#> year month day delay
#> <int> <int> <int> <dbl>
#> 1 2013 1 1 11.5
#> 2 2013 1 2 13.9
#> 3 2013 1 3 11.0
#> 4 2013 1 4 8.95
#> 5 2013 1 5 5.73
#> 6 2013 1 6 7.15
#> # … with 359 more rows
这是我的数据:
> df[1:9]
# A tibble: 36 x 9
# Groups: strain, time [18]
sample strain period time replicate labs Ghir_D11G005450 Ghir_D11G031170 Ghir_A03G015670
<chr> <chr> <dbl> <dbl> <dbl> <chr> <dbl> <dbl> <dbl>
1 FL-minus2-DPA24h-1 FL -2 -48 1 -2DPA-L 5.52 3.82 0
2 FL-minus2-DPA24h-2 FL -2 -48 2 -2DPA-L 6.44 3.70 0
3 FL-minus2-DPA12h-1 FL -2 -36 1 -2DPA-N 3.13 4.73 0
4 FL-minus2-DPA12h-2 FL -2 -36 2 -2DPA-N 4.61 3.86 0
5 FL-minus1-DPA24h-1 FL -1 -24 1 -1DPA-L 10.1 2.15 0
6 FL-minus1-DPA24h-2 FL -1 -24 2 -1DPA-L 5.57 0 0
7 FL-minus1-DPA12h-1 FL -1 -12 1 -1DPA-N 5.25 3.27 0
8 FL-minus1-DPA12h-2 FL -1 -12 2 -1DPA-N 6.06 3.16 0
9 FL-0-DPA24h-1 FL 0 0 1 0DPA-L 11.9 3.66 0
10 FL-0-DPA24h-2 FL 0 0 2 0DPA-L 4.38 1.19 0
# ... with 26 more rows
如果直接使用变量名,可以得到正确的结果,但是因为变量太多了,我无法一一传入。
> summarise(df[1:9],Ghir_D11G005450 = sum(Ghir_D11G005450))
`summarise()` regrouping output by 'strain' (override with `.groups` argument)
# A tibble: 18 x 3
# Groups: strain [2]
strain time Ghir_D11G005450
<chr> <dbl> <dbl>
1 FL -48 12.0
2 FL -36 7.74
3 FL -24 15.6
4 FL -12 11.3
5 FL 0 16.3
6 FL 12 10.1
7 FL 24 12.1
8 FL 36 20.2
9 FL 48 7.81
10 WT -48 20.7
11 WT -36 12.2
12 WT -24 13.3
13 WT -12 8.00
14 WT 0 17.3
15 WT 12 19.8
16 WT 24 28.3
17 WT 36 65.1
18 WT 48 45.4
试图用循环完成,但是发现会先对sum
里的表达式进行求值,无法得到分组求和的结果。
> summarise(df[1:9],"Ghir_D11G005450" = sum(df[1:9]$"Ghir_D11G005450" ))
`summarise()` regrouping output by 'strain' (override with `.groups` argument)
# A tibble: 18 x 3
# Groups: strain [2]
strain time Ghir_D11G005450
<chr> <dbl> <dbl>
1 FL -48 343.
2 FL -36 343.
3 FL -24 343.
4 FL -12 343.
5 FL 0 343.
6 FL 12 343.
7 FL 24 343.
8 FL 36 343.
9 FL 48 343.
10 WT -48 343.
11 WT -36 343.
12 WT -24 343.
13 WT -12 343.
14 WT 0 343.
15 WT 12 343.
16 WT 24 343.
17 WT 36 343.
18 WT 48 343.
不如说,问题在于,为什么在data.frame的context中,为什么可以直接把列名,也就是变量名作为一个对象,而不需要进行一个取子集的操作。照理来说,不应该出现object not found
吗。
不过我现在想要实现的目标还是标题所说的问题,如果有人能给出解决方案真是十分感激。
可能的机制
summarise
的实现是否是通过分组后调用summarise.grouped_df
,将数据根据分组分为多个子集,再在每个子集中执行参数中传入的函数。