dplyr mutate 和 summarise 在数据表中的等价物是啥? [复制]

Posted

技术标签:

【中文标题】dplyr mutate 和 summarise 在数据表中的等价物是啥? [复制]【英文标题】:What is the equivalent of dplyr mutate and summarise in data table? [duplicate]dplyr mutate 和 summarise 在数据表中的等价物是什么? [复制] 【发布时间】:2016-11-09 05:49:13 【问题描述】:

在包dplyr中,我们有操作:

mtcars %>%
    group_by(cyl) %>%
    summarise(max_mpg = max(mpg)) # output one result for each unique group,
                                  # result has nGroups number of rows.

给予

    cyl max_mpg
  <dbl>   <dbl>
1     4    33.9
2     6    21.4
3     8    19.2

mtcars %>%
    group_by(cyl) %>%
    mutate(max_mpg = max(mpg)) # output the same result for every row in the                       
                               # same group, result has same number of rows
                               # as input

给予

Source: local data frame [32 x 12]
Groups: cyl [3]

     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb max_mpg
   (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)   (dbl)
1   21.0     6 160.0   110  3.90 2.620 16.46     0     1     4     4    21.4
2   21.0     6 160.0   110  3.90 2.875 17.02     0     1     4     4    21.4
3   22.8     4 108.0    93  3.85 2.320 18.61     1     1     4     1    33.9
4   21.4     6 258.0   110  3.08 3.215 19.44     1     0     3     1    21.4
5   18.7     8 360.0   175  3.15 3.440 17.02     0     0     3     2    19.2
6   18.1     6 225.0   105  2.76 3.460 20.22     1     0     3     1    21.4
7   14.3     8 360.0   245  3.21 3.570 15.84     0     0     3     4    19.2
8   24.4     4 146.7    62  3.69 3.190 20.00     1     0     4     2    33.9
9   22.8     4 140.8    95  3.92 3.150 22.90     1     0     4     2    33.9
10  19.2     6 167.6   123  3.92 3.440 18.30     1     0     4     4    21.4
...

data.table 中这些操作的等价物是什么?

我认为mutate是由

data.table(mtcars) %>% 
    .[, max := max(mpg), by = cyl]

但我不知道如何获得 summarise 的等价物。如果您没有:=,无论出于何种原因,我都可以添加它,它会使用summarise,例如:

data.table(mtcars) %>% .[, max(mpg), by = cyl]

给予

   cyl   V1
1:   6 21.4
2:   4 33.9
3:   8 19.2

但如何为创建的V1 列分配名称并不明显。

【问题讨论】:

显而易见的问题是为什么mtcars %&gt;% data.table() %&gt;%.... - 为什么不单独使用data.table 语法而不是混合各种包? 这些天我在考虑使用管道进行函数操作,我想将data.table 功能与管道一起使用,所以这样布置对我来说很有意义。 this answer 中详细介绍了这些操作以及更多操作。我倾向于把它作为一个副本。 请注意,最近有一个包dtplyr 旨在提供:data.table 后端用于dplyr。我,我更喜欢data.table 语法... 阅读vignettes。 【参考方案1】:
library(data.table)
MT <- data.table(mtcars)

# summarise
MT[, .(max_mpg = max(mpg)), by = cyl]

   cyl max_mpg
1:   6    21.4
2:   4    33.9
3:   8    19.2

# mutate
MT[, max_mpg := max(mpg), by = cyl]

max_mpg被添加到MT中,但是这个命令不显示数据

显示数据:

MT[, max_mpg := max(mpg), by = cyl][]

由于数据有 32 行,所以只显示头部:

MT[, max_mpg := max(mpg), by = cyl][,head(.SD, 6)]

     mpg cyl disp  hp drat    wt  qsec vs am gear carb max_mpg
 1: 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4    21.4
 2: 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4    21.4
 3: 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1    33.9
 4: 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1    21.4
 5: 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2    19.2
 6: 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1    21.4

如果您希望按cyl 排序:(@thelatemail 建议的代码)

MT[, .(max_mpg = max(mpg)), keyby=cyl]

   cyl max_mpg
1:   4    33.9
2:   6    21.4
3:   8    19.2

编辑

添加这个以回应@Alex 的评论

data("mtcars")
setDT(mtcars)[, .(max_mpg = max(mpg)), by = cyl]

【讨论】:

MT[, .(max_mpg = max(mpg)), keyby=cyl] 是我认为在输出中按by= 值排序的首选方法。 哦,谢谢。我没有意识到这一点。刚开始阅读data.table @thelatemail,更新了答案。希望没问题。 谢谢,这很有趣,所以唯一的区别是添加了.() 我不确定发布此内容是否令人不快,但我认为此备忘单很有帮助:s3.amazonaws.com/assets.datacamp.com/img/blog/…

以上是关于dplyr mutate 和 summarise 在数据表中的等价物是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

dplyr 中的 mutate_each / summarise_each:如何选择某些列并为变异列赋予新名称?

R语言使用dplyr包使用group_by函数summarise函数和mutate函数计算分组下的均值标准差样本个数以及分组均值的95%执行区间对应的下限值和上限值(Calculate CI)

使用 dplyr、group_by 与 mutate() 或 summarise() & str_c() 或 paste() & 折叠连接字符串/行,但保持 NA & 所有字符

R语言dplyr包使用group_by函数和summarise函数构建频率表实战

tidyr::spread 和 dplyr::summarise 中的隐式排序

dplyr:连接到外部数据库时在 summarise() 中使用自定义函数