r - 在使用 group_by、quantile 和其他函数时创建新列需要很长时间并且没有给出预期的结果
问题描述
我有一个 100 列和 200 万行的数据框。列中的三列是year, compound_id, lt_rto
。野兔
length(unique(year))
30
length(unique(compound_id))
642
我想要做的是创建一个名为 avg_rto 的新列,它是每个year
最低compound_id
12% 值的lt_rto
平均值。例如 - 假设year
2001 年和coumpund_id
xyz,它会找到所有lt_rto
低于 12% 的值并计算平均值。这意味着将在 所在的行year == 2001 & comound_id == "xyz"
。
我想出的代码是 -
dt <- dt %>% group_by(year, compound_id) %>%
mutate( avg_rto = mean( dt[['lt_rto']] < quantile(fun.zero.omit(dt[['lt_rto']]),
probs = .88, na.rm = TRUE ) ))
注意:我还打算在计算较低的 12% 值时忽略零值。
上面的代码为所有观察结果提供了相同的值。而这也需要很多时间。
我的问题是我无法弄清楚代码有什么问题以及如何减少运行时间。
谢谢您的帮助。
解决方案
您可以编写一个忽略 0 值并计算最低 12% 的平均值的函数。
mean_of_lower_12_perc <- function(x) {
val <- x[x != 0]
mean(sort(val)[1:(0.12 * length(val))], na.rm = TRUE)
}
现在按组应用此功能。
library(dplyr)
dt %>%
group_by(year, compound_id) %>%
mutate( avg_rto = mean_of_lower_12_perc(lt_rto))
如果你的数据很大,你可以试试data.table
。
library(data.table)
setDT(dt)[, avg_rto := mean_of_lower_12_perc(lt_rto)]
推荐阅读
- django - 尝试在 docker-machine cookiecutter-django 中运行 docker-compose 时出现“关系不存在”错误
- sql - 包含其他子集的 SQL 集问题
- php - 如何在实时服务器上执行 Laravel(电子邮件)作业
- javascript - 使用带有条件javascript的地图从数组中提取id
- python - 提供关键字参数后可以给出 *args 吗?
- sql - SSRS 报告中的 TM 符号字体问题
- vim - Vim 拼写检查不适用于文本文件
- ruby-on-rails - 尝试在 mac 上运行 rails 应用程序时出错
- python - 通过 savefig 打开保存的 png 以将它们绘制在子图中
- html - 在响应式移动视图中,页面内容在屏幕右侧不可见