带有dplyr的自定义函数会针对某个因素内的不同级别进行突变或汇总?

时间:2018-08-27 04:36:32

标签: r 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"])

必须有一种方法可以在不同因素下将功能应用于不同级别?

任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:3)

您的示例代码是其中的大部分方式。您可以这样做:

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()进行调用创建正确的分组。

答案 1 :(得分:2)

一种选择是将value = random.randint(1,new_variable) 转换为“宽”格式,然后执行spread

-