自定义函数与dplyr变异或汇总因子中的不同级别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义函数与dplyr变异或汇总因子中的不同级别?相关的知识,希望对你有一定的参考价值。
以下是一些示例数据:
library(car)
library(dplyr)
df1 <- mtcars %>%
group_by(cyl, gear) %>%
summarise(
newvar = sum(wt)
)
# A tibble: 8 x 3
# Groups: cyl [?]
cyl gear newvar
<dbl> <dbl> <dbl>
1 4 3 2.46
2 4 4 19.0
3 4 5 3.65
4 6 3 6.68
5 6 4 12.4
6 6 5 2.77
7 8 3 49.2
8 8 5 6.74
如果我然后想要应用自定义函数计算每个气缸水平的3或5档齿轮的newvar值之间的差异怎么办?
df2 <- df1 %>% mutate(Diff = newvar[gear == "3"] - newvar[gear == "5"])
还是总结一下?
df2 <- df1 %>% summarise(Diff = newvar[gear == "3"] - newvar[gear == "5"])
必须有办法在不同因素内应用不同级别的功能吗?
任何帮助赞赏!
答案
您的示例代码大部分都在那里。你可以做:
df1 %>%
mutate(Diff = newvar[gear == "3"] - newvar[gear == "5"])
要么:
df1 %>%
summarise(Diff = newvar[gear == "3"] - newvar[gear == "5"])
逻辑子集仍然可以在mutate()
和summarise()
调用,就像任何其他向量一样。
请注意,这是因为在您的示例代码中调用summarise()
后,df1
仍按cyl
分组,否则您需要执行group_by()
调用以创建正确的分组。
另一答案
一个选项是将spread
变成'宽'格式然后再做-
library(tidyverse)
df1 %>%
filter(gear %in% c(3, 5) ) %>%
spread(gear, newvar) %>%
transmute(newvar = `3` - `5`)
# A tibble: 3 x 2
# Groups: cyl [3]
# cyl newvar
# <dbl> <dbl>
#1 4 -1.19
#2 6 3.90
#3 8 42.5
以上是关于自定义函数与dplyr变异或汇总因子中的不同级别?的主要内容,如果未能解决你的问题,请参考以下文章
当我在`dplyr`之后加载`plyr`时,为啥汇总或变异不适用于group_by?