gpt4 book ai didi

r - dplyr 用于逐行分位数

转载 作者:行者123 更新时间:2023-12-01 07:24:20 25 4
gpt4 key购买 nike

我有一个 df 层,每个层都有 1000 个来自该层估计值的后验分布的样本。

mydf <- as.data.frame(lapply(seq(1, 1000), rnorm, n=100))
colnames(mydf) <- paste('s', seq(1, ncol(mydf)), sep='')

我想为每一行的分布的几个分位数添加列。在经典的 R 中,我会写这个。
quants <- t(apply(mydf, 1, quantile, probs=c(.025, .5, .975)))
colnames(quants) <- c('s_lo', 's_med', 's_hi')
mydf <- cbind(mydf, quants)

我怀疑在 dplyr 中有直接的方法可以做到这一点(也许 rowwise ?)但我的尝试失败了。想法?

最佳答案

dplyr没有针对这样的基于行的计算进行优化。虽然您可以使用 rowwise() ,我建议不要这样做:性能会很糟糕。您的最佳速度可能是期望 matrix 的东西。 , 并且可以对行进行操作。我建议apply .

而不是处理 100x1000 data.frame ,为简洁起见,我将使用 5 列:

set.seed(2)
mydf <- as.data.frame(lapply(seq(1, 5), rnorm, n=10))
colnames(mydf) <- paste('s', seq(1, ncol(mydf)), sep='')

转换为 matrix仅当所有列都属于相同 class 时才合理.在这种情况下,它们都是 numeric所以我们是安全的。 (如果您在数据框中有非数字列,请仅在此处提取您需要的列并稍后将它们绑定(bind)回来。)
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)))))
# s1 s2 s3 s4 s5 10% 90%
# 1 0.1030855 2.4176508 5.0908192 4.738939 4.616414 1.02891157 4.950067
# 2 1.1848492 2.9817528 1.8000742 4.318960 3.040897 1.43093918 3.807735
# 3 2.5878453 1.6073046 4.5896382 5.076164 4.158295 1.99952092 4.881554
# 4 -0.1303757 0.9603310 4.9546516 3.715842 6.903547 0.30590700 6.123989
# 5 0.9197482 3.7822290 3.0049378 3.223325 5.622494 1.75382406 4.886388
# 6 1.1324203 -0.3110691 0.5482936 3.404340 6.990920 0.03267599 5.556288
# 7 1.7079547 2.8786046 3.4772373 2.274020 4.694516 1.93438093 4.207605
# 8 0.7603020 2.0358067 2.4034418 3.097416 4.909156 1.27050387 4.184460
# 9 2.9844739 3.0128287 3.7922033 3.440938 4.815839 2.99581584 4.406384
# 10 0.8612130 2.4322652 3.2896367 3.753487 3.801232 1.48963385 3.782134

我将把列命名留给你。

关于r - dplyr 用于逐行分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43480362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com