dplyr
并不适用于基于行的计算。虽然你可以使用rowwise()
来完成这个任务,但我不建议这样做:性能将非常差。最好的速度可能来自于期望一个matrix
并且可以对行进行操作的东西。我建议使用apply
。
为了简洁起见,我将使用只有5列的数据框而不是100x1000的数据框。
set.seed(2)
mydf <- as.data.frame(lapply(seq(1, 5), rnorm, n=10))
colnames(mydf) <- paste('s', seq(1, ncol(mydf)), sep='')
将数据框转换为矩阵只有在所有列的
class
相同时才是合理的。在这种情况下,它们都是
numeric
类型的,所以我们是安全的。(如果数据框中有非数字列,请在此处仅提取所需列,并稍后绑定回来。)
mymtx <- as.matrix(mydf)
apply(mymtx, 1, quantile, c(0.1, 0.9))
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# 10% 1.028912 1.430939 1.999521 0.305907 1.753824 0.03267599 1.934381 1.270504 2.995816 1.489634
# 90% 4.950067 3.807735 4.881554 6.123989 4.886388 5.55628806 4.207605 4.184460 4.406384 3.782134
使用
apply
的一个显著特点是,结果以行为基础,可能与预期的不同。只需将其包装在
t(...)
中,您就会看到您期望的列。
可以使用
cbind
或类似的函数将其与原始数据框重新组合。
可以像这样在管道中完成此操作:
mydf %>%
bind_cols(as.data.frame(t(apply(., 1, quantile, c(0.1, 0.9)))))
我会把列名的命名交给你处理。
plyr::adply
may be a better choice:adply(mydf, 1, function(d) quantile(d, c(.025, .5, .975)))
- bouncyballmatrixStats
包(特别是rowQuantiles
函数)。它比使用for/apply要快得多。 - konvas