r - 应用不同的过滤器并随后计算均值
问题描述
我正在使用 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))
并为每个子集获取一个值,但我不知道这是否可能。
有什么想法吗?谢谢
解决方案
这里有两个可能的结果——一个循环和一个映射选项。
首先是一些过滤器选项:
filter_vec <- c("mpg > 12",
"mpg > 20",
"mpg > 12 & mpg < 20",
"mpg < 12",
"mpg < 25")
- 环形
# 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
- 呼噜声: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
推荐阅读
- java - 我可以将 Spring @bean 定义为 @Repository 或 @Service 吗?
- perceptron - 使用 SPSS 的 MLP-NN 衡量排名重要性的指标是什么?(在 SPSS 中有类似 Matthew 的系数吗?)
- vue.js - 无法访问嵌套对象中的对象数据
- php - 使用 codeigniter 类解析 HTTP_USER_AGENT
- ruby-on-rails - 跳过非开发环境 gems 安装
- django - 在 django rest 框架中创建用户时验证用户名
- python - Scapy、Socket 和 3 次握手
- angular - 如何强制 NSwag 和 ng-swagger-gen 在接口中生成子类属性
- android - 作为 UI 测试的一部分,在 Application 类中进行的模拟 API 调用
- mysql - 在 MySQL 中触发自增组合键