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 %>% data.table() %>%....
- 为什么不单独使用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函数构建频率表实战