此问题是对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)
是否有一种优化方法来计算每个值的百分位数?基本上我想让它尽可能高效,因此运行时间尽可能小。
答案 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.percentile
和val.percentile.2
的结果几乎完全相同。