有效地计算dataframe列的百分位数

时间:2016-12-11 14:21:29

标签: r dataframe quantile ecdf

此问题是对StackOverflow问题的扩展,并已回答here

我的情况不同,因为我想计算50,000(或更多!)值的矢量中每个值的百分位数。例如 -

df <- data.frame(val = rnorm(n = 50000, mean = 50, sd = 20))
df$val.percentile <- sapply(X = df$val, function(x) ecdf(df$val)(x))
head(df)

是否有一种优化方法来计算每个值的百分位数?基本上我想让它尽可能高效,因此运行时间尽可能小。

2 个答案:

答案 0 :(得分:4)

ecdf已经过矢量化,没有理由使用apply函数。你可以简单地运行:

df$val.percentile <- ecdf(df$val)(df$val)

答案 1 :(得分:2)

您可以实施dplyr::percent_rank根据百分位数对每个值进行排名。

df.per <- df %>% 
  mutate(val.percentile = percent_rank(val))

修改

我相信@ 42对这个问题有更好的选择。 OP的关注点是大型数据集。虽然dplyr::percent_rank非常快,但@ 42的答案要快得多。

我将行数增加到1,000,000并运行以下代码:

df <- data.frame(val = rnorm(n = 1000000, mean = 50, sd = 20))

我最初的回应:

t <- proc.time()
df <- df %>% 
  mutate(val.percentile = percent_rank(val))
proc.time() - t


 user  system elapsed 
2.484   0.068   2.554 

@ 42的答案:

t <- proc.time()
df$val.percentile.2 <- ecdf(df$val)(df$val)
proc.time() - t


 user  system elapsed 
1.048   0.004   1.048

很明显ecdf在给定的上下文中表现得更好。 val.percentileval.percentile.2的结果几乎完全相同。