首页 > 解决方案 > 应用不同的过滤器并随后计算均值

问题描述

我正在使用 dplyr 过滤数据框,然后计算每行上方子集的平均值。

data.example <- mtcars %>%
 filter(mpg >= 12) %>%
 arrange(mpg) %>%
 mutate(mean.mpg = round(rev(cummean(rev(mpg))),2))

我对第一个值感兴趣 data.example$mean.mpg[1],在本例中为20.74。我需要针对不同的值重复此操作,例如:

mpg>=20 (result is 25.48);  
mpg>=25;  
mpg<12;  
mpg<25;  
12<mpg<25, etc., 

更改过滤器值的时间效率不高。我在 r 中找到了具有匹配条件的子集值

data.example2 <- mtcars %>%
 arrange(mpg) %>%
 mutate(mean.mpg = round(rev(cummean(rev(mpg))),2))

cuts <- c(12,20,25)
setDT(data.example2)[data.table(cuts = cuts), .(ids = disp, cuts, mean.mpg), 

我可以将上述内容应用于大于或等于切割的 mpg(mpg>=12 等),但是当切割的目标值小于(mpg<12 等)时,这将不起作用。

背后的想法是做一些事情filter(mpg >= 12 | mpg <12 | between(mpg, 12, 25))并为每个子集获取一个值,但我不知道这是否可能。

有什么想法吗?谢谢

标签: rdplyrsubset

解决方案


这里有两个可能的结果——一个循环和一个映射选项。

首先是一些过滤器选项:

filter_vec <- c("mpg > 12", 
                "mpg > 20", 
                "mpg > 12 & mpg < 20",
                "mpg < 12",
                "mpg < 25")
  1. 环形
# half empty dataframe for the results
df <- data.frame(condition = filter_vec,
                 mean = NA_real_)

for(x in filter_vec) {
  mean_value <- mtcars %>% 
    filter(eval(str2expression(x))) %>%
    summarise(mean.mpg = round(mean(mpg, na.rm = T),2))
  
  df[which(x == filter_vec), "mean"] <- mean_value
}

输出

            condition  mean
1            mpg > 12 20.74
2            mpg > 20 25.48
3 mpg > 12 & mpg < 20 16.59
4            mpg < 12 10.40
5            mpg < 25 17.79
  1. 呼噜声:map_df

filtering <- function(x) {
   mtcars %>% 
    filter(eval(str2expression(x))) %>%
    summarise(result = round(mean(mpg, na.rm = T),2)) %>%
    add_column(condition = x)
}

map_df(filter_vec, filtering)

输出

  result           condition
1  20.74            mpg > 12
2  25.48            mpg > 20
3  16.59 mpg > 12 & mpg < 20
4  10.40            mpg < 12
5  17.79            mpg < 25

推荐阅读