我在 dplyr-syntax 上有点挣扎。我有一个包含不同变量和一个分组变量的数据框。现在我想使用 R 中的 dplyr 计算每组中每一列的平均值。
df <- data.frame( a = sample(1:5, n, replace = TRUE), b = sample(1:5, n, replace = TRUE), c = sample(1:5, n, replace = TRUE), d = sample(1:5, n, replace = TRUE), grp = sample(1:3, n, replace = TRUE) ) df %>% group_by(grp) %>% summarise(mean(a))
这给了我“grp”表示的每个组的“a”列的平均值。
我的问题是:是否有可能一次获得每个组中每列的平均值?还是我必须df %>% group_by(grp) %>% summarise(mean(a))为每一列重复?
df %>% group_by(grp) %>% summarise(mean(a))
我想要的是类似的东西
df %>% group_by(grp) %>% summarise(mean(a:d)) # "mean(a:d)" does not work
在dplyr(>=1.00) 中,您可以使用across(everything()insummarise将函数应用于所有变量:
dplyr
across(everything()
summarise
library(dplyr) df %>% group_by(grp) %>% summarise(across(everything(), list(mean))) #> # A tibble: 3 x 5 #> grp a b c d #> <int> <dbl> <dbl> <dbl> <dbl> #> 1 1 3.08 2.98 2.98 2.91 #> 2 2 3.03 3.04 2.97 2.87 #> 3 3 2.85 2.95 2.95 3.06
或者,该purrrlyr软件包提供相同的功能:
purrrlyr
library(purrrlyr) df %>% slice_rows("grp") %>% dmap(mean) #> # A tibble: 3 x 5 #> grp a b c d #> <int> <dbl> <dbl> <dbl> <dbl> #> 1 1 3.08 2.98 2.98 2.91 #> 2 2 3.03 3.04 2.97 2.87 #> 3 3 2.85 2.95 2.95 3.06
也不要忘记data.table(用于keyby对排序组进行排序):
data.table
keyby
library(data.table) setDT(df)[, lapply(.SD, mean), keyby = grp] #> grp a b c d #> 1: 1 3.079412 2.979412 2.979412 2.914706 #> 2: 2 3.029126 3.038835 2.967638 2.873786 #> 3: 3 2.854701 2.948718 2.951567 3.062678
让我们尝试比较性能。
library(dplyr) library(purrrlyr) library(data.table) library(bench) set.seed(123) n <- 10000 df <- data.frame( a = sample(1:5, n, replace = TRUE), b = sample(1:5, n, replace = TRUE), c = sample(1:5, n, replace = TRUE), d = sample(1:5, n, replace = TRUE), grp = sample(1:3, n, replace = TRUE) ) dt <- setDT(df) mark( dplyr = df %>% group_by(grp) %>% summarise(across(everything(), list(mean))), purrrlyr = df %>% slice_rows("grp") %>% dmap(mean), data.table = dt[, lapply(.SD, mean), keyby = grp], check = FALSE ) #> # A tibble: 3 x 6 #> expression min median `itr/sec` mem_alloc `gc/sec` #> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl> #> 1 dplyr 2.81ms 2.85ms 328. NA 17.3 #> 2 purrrlyr 7.96ms 8.04ms 123. NA 24.5 #> 3 data.table 596.33µs 707.91µs 1409. NA 10.3