【发布时间】:2018-02-21 14:44:29
【问题描述】:
当我在dplyr中使用group_by和summary时,自然可以对不同的变量应用不同的summary函数。例如:
library(tidyverse)
df <- tribble(
~category, ~x, ~y, ~z,
#----------------------
'a', 4, 6, 8,
'a', 7, 3, 0,
'a', 7, 9, 0,
'b', 2, 8, 8,
'b', 5, 1, 8,
'b', 8, 0, 1,
'c', 2, 1, 1,
'c', 3, 8, 0,
'c', 1, 9, 1
)
df %>% group_by(category) %>% summarize(
x=mean(x),
y=median(y),
z=first(z)
)
输出结果:
# A tibble: 3 x 4
category x y z
<chr> <dbl> <dbl> <dbl>
1 a 6 6 8
2 b 5 1 8
3 c 2 8 1
我的问题是,我将如何使用 summarise_at 执行此操作?显然对于这个例子来说这是不必要的,但假设我有很多变量要取平均值,很多中位数等等。
一旦我转移到 summarise_at,我会失去这个功能吗?我是否必须对所有变量组使用所有函数,然后丢弃我不想要的那些?
也许我只是遗漏了一些东西,但我无法弄清楚,而且我在文档中也没有看到任何这样的例子。任何帮助表示赞赏。
【问题讨论】:
-
基本的
Map功能可以做到这一点,例如Map(function(f,v) f(v), c(mean,median,first), df[c("x","y","z")])。也许purrr的map可以做类似的事情? -
是的,我想知道 purrr 是否可以为我们提供摆脱这种情况的方法。值得研究。但是在您的示例中,您不只是将所有函数应用于所有变量吗?以及如何将它与 group_by 一起使用?
-
不,我正在使用
Map将每个函数依次应用于每个变量 - 查看mean(df$x); median(df$y); first(df$z)的结果并与Map代码进行比较。 -
好的,我明白你的意思了,但我的问题与 ycw 相同:如果我有第一个函数的三个变量,第二个函数有 10 个变量,第三个函数有一个变量怎么办?这看起来像是 summarise_at 的替代品,而不是放在里面的东西。我想我要的是完整的代码,因为当我将您的建议应用于我的示例数据框时,我没有得到我正在寻找的答案。