R 查找以组最大值为条件的范围的平均因子

R 查找以组最大值为条件的范围的平均因子,r,aggregate,R,Aggregate,这感觉应该不难,但我一直在努力,却找不到合适的答案,所以我想我会问 我有一个数据集,我想按因子列拆分,然后取平均值。这很容易。复杂的是,我想进一步限制这意味着只有在第二列的最大值的特定范围内的值 例如,使用mtcars,我希望平均值hp,drat和wt按气缸分组(cyl),并且在最大排量的50cc之内(disp) 使用aggregatesubset参数不适用于每个子集,而是适用于整个数据集。因此,我们只得到了8缸汽车的正确平均值,而不是4缸或6缸汽车 aggregate(data=mtcars,

这感觉应该不难,但我一直在努力,却找不到合适的答案,所以我想我会问

我有一个数据集,我想按因子列拆分,然后取平均值。这很容易。复杂的是,我想进一步限制这意味着只有在第二列的最大值的特定范围内的值

例如,使用
mtcars
,我希望平均值
hp
drat
wt
按气缸分组(
cyl
),并且在最大排量的50cc之内(
disp

使用
aggregate
subset参数不适用于每个子集,而是适用于整个数据集。因此,我们只得到了8缸汽车的正确平均值,而不是4缸或6缸汽车

aggregate(data=mtcars, cbind(hp, drat, wt) ~ factor(cyl), FUN=mean, subset=c(disp<=max(disp) & disp>=max(disp)-50))

#factor(cyl)       hp     drat       wt
#1           8 216.6667 3.053333 5.339667

我显然遗漏了一些东西。我要寻找的是返回一个数据帧,每个气缸有行(4、6、8),列中有hp、drat和wt的平均值,每个组中只有排名前50位的汽车

我认为这可以通过使用
dplyr
实现

library(dplyr)
data <- mtcars %>% group_by(cyl) %>% filter(max(disp)-disp<=50) %>%
            summarise_each(funs="mean",hp,drat,wt)

data
# A tibble: 3 × 4
    cyl        hp     drat       wt
  <dbl>     <dbl>    <dbl>    <dbl>
1     4  91.16667 3.950000 2.674167
2     6 107.50000 2.920000 3.337500
3     8 216.66667 3.053333 5.339667
库(dplyr)
数据%group\U by(cyl)%>%过滤器(最大(显示)-显示%
对每个项目进行总结(funs=“mean”、hp、drat、wt)
数据
#一个tibble:3×4
气缸hp drat wt
1     4  91.16667 3.950000 2.674167
2     6 107.50000 2.920000 3.337500
3     8 216.66667 3.053333 5.339667

我认为使用
dplyr
就可以做到这一点

library(dplyr)
data <- mtcars %>% group_by(cyl) %>% filter(max(disp)-disp<=50) %>%
            summarise_each(funs="mean",hp,drat,wt)

data
# A tibble: 3 × 4
    cyl        hp     drat       wt
  <dbl>     <dbl>    <dbl>    <dbl>
1     4  91.16667 3.950000 2.674167
2     6 107.50000 2.920000 3.337500
3     8 216.66667 3.053333 5.339667
库(dplyr)
数据%group\U by(cyl)%>%过滤器(最大(显示)-显示%
对每个项目进行总结(funs=“mean”、hp、drat、wt)
数据
#一个tibble:3×4
气缸hp drat wt
1     4  91.16667 3.950000 2.674167
2     6 107.50000 2.920000 3.337500
3     8 216.66667 3.053333 5.339667

使用拆分应用联合收割机方法的基本R方法是

do.call(rbind, lapply(split(mtcars, mtcars$cyl), function(i) {
       sapply(i[i$disp<=max(i$disp) & i$disp>=max(i$disp)-50, c("hp", "drat", "wt")], mean)))
         hp     drat       wt
4  91.16667 3.950000 2.674167
6 107.50000 2.920000 3.337500
8 216.66667 3.053333 5.339667
do.call(rbind,lappy(split(mtcars,mtcars$cyl))函数(i){
SAPPY(i[i$disp=max(i$disp)-50,c(“hp”、“drat”、“wt”)],平均值)
hp drat wt
4  91.16667 3.950000 2.674167
6 107.50000 2.920000 3.337500
8 216.66667 3.053333 5.339667

在这里,数据按cyl拆分为data.frames列表,然后根据您的标准划分为子集。然后计算所需变量的平均值。使用
do.call将结果列表绑定到data.frames中。使用split apply combine方法的基本R方法是

do.call(rbind, lapply(split(mtcars, mtcars$cyl), function(i) {
       sapply(i[i$disp<=max(i$disp) & i$disp>=max(i$disp)-50, c("hp", "drat", "wt")], mean)))
         hp     drat       wt
4  91.16667 3.950000 2.674167
6 107.50000 2.920000 3.337500
8 216.66667 3.053333 5.339667
do.call(rbind,lappy(split(mtcars,mtcars$cyl))函数(i){
SAPPY(i[i$disp=max(i$disp)-50,c(“hp”、“drat”、“wt”)],平均值)
hp drat wt
4  91.16667 3.950000 2.674167
6 107.50000 2.920000 3.337500
8 216.66667 3.053333 5.339667

在这里,数据按cyl划分为data.frames列表,然后根据您的标准划分为子集。然后计算所需变量的平均值。使用
do.call将结果列表合并为data.frames。为了完整起见,这里还有一个
data.table
解决方案

OP已请求返回一个数据帧,其中每个
气缸(4、6、8)的行数和
hp
的平均值、
drat
wt
的列数仅用于每组前50毫升的汽车。因此,有两个任务:

  • 选择符合条件的车辆
  • 按组聚合相关列
  • 使用
    data.table

    library(data.table)
    mtcars <- as.data.table(mtcars)
    mtcars[mtcars[, .I[disp >= max(disp) - 50], by = cyl]$V1, 
           lapply(.SD, mean), .SDcols = c("hp", "drat", "wt"), keyby = cyl]
    
    第一项任务由以下人员完成:

    mtcars[, .I[disp >= max(disp) - 50], by = cyl]$V1
    
    它返回满足条件的车辆的行号,这些车辆位于每组前50 cc的范围内

    最后,根据请求按组聚合所选行


    请注意,
    setDT(mtcars)
    不能像往常一样使用,因为
    mtcars
    驻留在一个包中,该包被锁定以防止修改其变量绑定。

    为完整起见,这里还有一个
    数据表
    解决方案

    OP已请求返回一个数据帧,其中每个
    气缸(4、6、8)的行数和
    hp
    的平均值、
    drat
    wt
    的列数仅用于每组前50毫升的汽车。因此,有两个任务:

  • 选择符合条件的车辆
  • 按组聚合相关列
  • 使用
    data.table

    library(data.table)
    mtcars <- as.data.table(mtcars)
    mtcars[mtcars[, .I[disp >= max(disp) - 50], by = cyl]$V1, 
           lapply(.SD, mean), .SDcols = c("hp", "drat", "wt"), keyby = cyl]
    
    第一项任务由以下人员完成:

    mtcars[, .I[disp >= max(disp) - 50], by = cyl]$V1
    
    它返回满足条件的车辆的行号,这些车辆位于每组前50 cc的范围内

    最后,根据请求按组聚合所选行


    请注意
    setDT(mtcars)
    不能像往常一样使用,因为
    mtcars
    驻留在一个被锁定的包中,以防止修改其变量绑定。

    谢谢!我对此进行了改进,但选择了Andrew的
    dplyr
    解决方案,因为它更简洁。谢谢!我对其进行了改进,但选择了Andrew的
    dplyr
    解决方案,因为它更具说服力练习:RStudio dplyr和tidyr备忘单是一个很好的起点RStudio dplyr和tidyr备忘单是一个很好的起点