如何找到 data.frame 的每个变量的分位数
How to find the quantiles of each variable of a data.frame
我有一个包含多个变量的数据框,我想找到每个变量的分位数 ()
示例代码:
testtable = data.frame(groupvar = c(rep('x',100), rep('y',100)),
numericvar = rnorm(200))
我想将 quantile(., c(.05, .1, .25, .5, .75, .9, .95)
) 应用于 testtable
中的每个变量。理想的结果应该是
x y
.05 .05
.1 .1
.25 .25
.5 .5
.75 .75
.9 .9
.95 .95
其中每个条目都是 x
或 y
的分位数。例如,.05
是 x
的第 5 个百分位数 .1
是 x
的第 10 个百分位数分布,等等
我在 dplyr
中尝试了 summarise
,但是 运行 遇到了问题,因为我的 quantile
函数返回了一个长度为 7 的向量。
最好的方法是什么?
这是一个基本的 R 解决方案,我们 unstack
数据框并计算每列的分位数,每个分位数,即
sapply(unstack(testtable, numericvar ~ groupvar), function(i) quantile(i, v1))
这给出了,
x y
5% -1.82980882 -1.49900735
10% -1.26047295 -1.02626933
25% -0.83928910 -0.68248217
50% 0.02757385 -0.02096953
75% 0.64842517 0.48624513
90% 1.63382801 1.09722178
95% 1.91104161 1.72846846
其中 v1 <- c(0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95)
另一种可能lapply
,我们需要先转换为list
:
l <- split(testtable$numericvar, testtable$groupvar)
现在我们可以得到 quantile
然后转换回 data.frame
:
ll <- lapply(l, function(x) quantile(unlist(x), c(.05, .1, .25, .5, .75, .9, .95)))
as.data.frame(ll)
# x y
# 5% -1.8028162 -1.69293054
# 10% -1.3129427 -1.23125086
# 25% -0.7335853 -0.57010352
# 50% -0.1223181 0.05119533
# 75% 0.6727871 0.66203631
# 90% 1.3411195 1.08830220
# 95% 1.7068070 1.54248740
这可以变成一个函数来调用,你可以添加更多的东西让它更通用:
quantile_grouped <- function(data, group_var = "groupvar", quantile_var = "numericvar") {
l <- split(testtable[, quantile_var], testtable[, group_var ])
ll <- lapply(l, function(x) quantile(unlist(x), c(.05, .1, .25, .5, .75, .9, .95)))
as.data.frame(ll)
}
quantile_grouped(testtable)
另一个选项:
pr <- c(0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95)
as.data.frame.list(tapply(testtable$numericvar, testtable$groupvar,
quantile, probs = pr))
给出:
x y
5% -1.57823487 -1.5142682
10% -1.28807795 -1.2153000
25% -0.60598752 -0.6889401
50% -0.07536852 -0.2036487
75% 0.57269482 0.4892494
90% 1.04087379 1.2231926
95% 1.22329927 1.7421848
我有一个包含多个变量的数据框,我想找到每个变量的分位数 ()
示例代码:
testtable = data.frame(groupvar = c(rep('x',100), rep('y',100)),
numericvar = rnorm(200))
我想将 quantile(., c(.05, .1, .25, .5, .75, .9, .95)
) 应用于 testtable
中的每个变量。理想的结果应该是
x y
.05 .05
.1 .1
.25 .25
.5 .5
.75 .75
.9 .9
.95 .95
其中每个条目都是 x
或 y
的分位数。例如,.05
是 x
的第 5 个百分位数 .1
是 x
的第 10 个百分位数分布,等等
我在 dplyr
中尝试了 summarise
,但是 运行 遇到了问题,因为我的 quantile
函数返回了一个长度为 7 的向量。
最好的方法是什么?
这是一个基本的 R 解决方案,我们 unstack
数据框并计算每列的分位数,每个分位数,即
sapply(unstack(testtable, numericvar ~ groupvar), function(i) quantile(i, v1))
这给出了,
x y 5% -1.82980882 -1.49900735 10% -1.26047295 -1.02626933 25% -0.83928910 -0.68248217 50% 0.02757385 -0.02096953 75% 0.64842517 0.48624513 90% 1.63382801 1.09722178 95% 1.91104161 1.72846846
其中 v1 <- c(0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95)
另一种可能lapply
,我们需要先转换为list
:
l <- split(testtable$numericvar, testtable$groupvar)
现在我们可以得到 quantile
然后转换回 data.frame
:
ll <- lapply(l, function(x) quantile(unlist(x), c(.05, .1, .25, .5, .75, .9, .95)))
as.data.frame(ll)
# x y
# 5% -1.8028162 -1.69293054
# 10% -1.3129427 -1.23125086
# 25% -0.7335853 -0.57010352
# 50% -0.1223181 0.05119533
# 75% 0.6727871 0.66203631
# 90% 1.3411195 1.08830220
# 95% 1.7068070 1.54248740
这可以变成一个函数来调用,你可以添加更多的东西让它更通用:
quantile_grouped <- function(data, group_var = "groupvar", quantile_var = "numericvar") {
l <- split(testtable[, quantile_var], testtable[, group_var ])
ll <- lapply(l, function(x) quantile(unlist(x), c(.05, .1, .25, .5, .75, .9, .95)))
as.data.frame(ll)
}
quantile_grouped(testtable)
另一个选项:
pr <- c(0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95)
as.data.frame.list(tapply(testtable$numericvar, testtable$groupvar,
quantile, probs = pr))
给出:
x y 5% -1.57823487 -1.5142682 10% -1.28807795 -1.2153000 25% -0.60598752 -0.6889401 50% -0.07536852 -0.2036487 75% 0.57269482 0.4892494 90% 1.04087379 1.2231926 95% 1.22329927 1.7421848