首页 > 解决方案 > 在使用 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平均值。例如 - 假设year2001 年和coumpund_idxyz,它会找到所有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% 值时忽略零值。

上面的代码为所有观察结果提供了相同的值。而这也需要很多时间。

我的问题是我无法弄清楚代码有什么问题以及如何减少运行时间。

谢谢您的帮助。

标签: rdata-manipulation

解决方案


您可以编写一个忽略 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)]

推荐阅读