自定义函数与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?

带有 dplyr 的用户定义函数 - 变异列是一个参数

总结并列出 dplyr 中的自定义索引

R语言dplyr包recode函数recode_factor函数数值或因子替换实战

在用户定义的函数中使用胶水进行变异

在 R 中使用 dplyr 在 group_by 之后应用自定义函数