具有dplyr的自定义函数在一个因子内针对不同级别进行变异或汇总?

具有dplyr的自定义函数在一个因子内针对不同级别进行变异或汇总?,r,dplyr,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

以下是一些示例数据:

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
库(车)
图书馆(dplyr)
df1%
组别(气缸,档位)%>%
总结(
newvar=总和(wt)
)
#一个tibble:8x3
#组别:共青团[?]
圆柱齿轮
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档汽车的新VAR值之间的差异,该怎么办

df2 <- df1 %>%  mutate(Diff = newvar[gear == "3"] - newvar[gear == "5"]) 
df2%变异(Diff=newvar[gear==“3”]-newvar[gear==“5”])
还是总结

df2 <- df1 %>%  summarise(Diff = newvar[gear == "3"] - newvar[gear == "5"])
df2%摘要(差异=newvar[gear==“3”]-新var[gear==“5”])
必须有一种方法在不同的因素中应用不同级别的功能


感谢您的帮助

您的示例代码大部分都在这里。你可以做:

df1 %>% 
    mutate(Diff = newvar[gear == "3"] - newvar[gear == "5"])
或:

逻辑子集仍然可以在
mutate()
summary()
调用中使用,就像任何其他向量一样


请注意,这是因为在示例代码中调用
summary()
后,
df1
仍按
cyl
分组,否则需要执行
group\u by()
调用来创建正确的分组

您的示例代码大部分都在这里。你可以做:

df1 %>% 
    mutate(Diff = newvar[gear == "3"] - newvar[gear == "5"])
或:

逻辑子集仍然可以在
mutate()
summary()
调用中使用,就像任何其他向量一样


请注意,这是因为在示例代码中调用
summary()
后,
df1
仍按
cyl
分组,否则需要执行
group\u by()
调用来创建正确的分组

一个选项是将
扩展成“宽”格式,然后执行
-

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 
库(tidyverse)
df1%>%
过滤器(档位%c(3,5))%>%
排列(齿轮,新变量)%>%
转换(newvar=`3`-`5`)
#一个tibble:3x2
#组别:共青团[3]
#赛尔纽瓦尔
#    
#1     4  -1.19
#2     6   3.90
#3     8  42.5 

一个选项是将
扩展成“宽”格式,然后执行
-

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 
库(tidyverse)
df1%>%
过滤器(档位%c(3,5))%>%
排列(齿轮,新变量)%>%
转换(newvar=`3`-`5`)
#一个tibble:3x2
#组别:共青团[3]
#赛尔纽瓦尔
#    
#1     4  -1.19
#2     6   3.90
#3     8  42.5 

在我编写此答案时,您似乎更新了示例代码以与之匹配-此解决方案是否有您不喜欢的地方?你可能需要更新你的问题来解释为什么这不能满足你的需要。谢谢你的快速回答!我想我已经更新添加了“newvar”的时间和你一样!在我写这个答案的时候,看起来你更新了你的示例代码来匹配这个问题——这个解决方案有什么你不喜欢的地方吗?你可能需要更新你的问题来解释为什么这不能满足你的需要。谢谢你的快速回答!我想我已经更新添加了“newvar”的时间和你一样!