2016-12-11 70 views
1

此问题是对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

您可以实施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的结果几乎相同。

4

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

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

这个答案与我的不同吗? –

+0

@ 42-它不是,但你和巴克几乎同时发布(巴克是第一个) – Jaap

+0

呵呵,当我发布(或正在做我的编辑)时没有看到它。我假设它迟到了。 –