【发布时间】:2020-09-01 08:37:40
【问题描述】:
我正在使用 lapply 函数来估计数据框列表的几列的分位数:
stack(lapply(df[3:6], quantile, prob = c(0.25,0.50,0.75), **names = c("q0.25, q0.50, q0.75")**))
它按我预期的那样工作,少了名称的最后一部分,我如何在输出表中创建一个列来说明每一行是什么:q0.25、q0.50、q.075
【问题讨论】:
我正在使用 lapply 函数来估计数据框列表的几列的分位数:
stack(lapply(df[3:6], quantile, prob = c(0.25,0.50,0.75), **names = c("q0.25, q0.50, q0.75")**))
它按我预期的那样工作,少了名称的最后一部分,我如何在输出表中创建一个列来说明每一行是什么:q0.25、q0.50、q.075
【问题讨论】:
您可以使用sapply,它将返回具有适当名称的矩阵:
t(sapply(df[3:6], quantile, prob = c(0.25,0.50,0.75)))
如果您想要特定名称,可以将数据转换为数据框并使用setNames。
setNames(data.frame(t(sapply(df[3:6], quantile, prob = c(0.25,0.50,0.75)))),
c("q0.25", "q0.50", "q0.75"))
例如,使用mtcars数据集-
setNames(data.frame(t(sapply(mtcars[3:6], quantile, prob = c(0.25,0.50,0.75)))),
c("q0.25", "q0.50", "q0.75"))
# q0.25 q0.50 q0.75
#disp 120.82500 196.300 326.00
#hp 96.50000 123.000 180.00
#drat 3.08000 3.695 3.92
#wt 2.58125 3.325 3.61
【讨论】:
在一行中包含purrr 的解决方案[为了示例df <- mtcars,我使用了mtcars]
purrr::map_dfr(df[3:6], quantile, prob = c(0.25,0.50,0.75), .id = "names")
# A tibble: 4 x 4
names `25%` `50%` `75%`
<chr> <dbl> <dbl> <dbl>
1 disp 121. 196. 326
2 hp 96.5 123 180
3 drat 3.08 3.70 3.92
4 wt 2.58 3.32 3.61
或以长格式输出:
library(purrr)
map(mtcars[3:6], quantile, prob = c(0.25,0.50,0.75)) %>%
map_dfr(tibble::as_tibble, rownames = "quantiles", .id = "names")
# A tibble: 12 x 3
names quantiles value
<chr> <chr> <dbl>
1 disp 25% 121.
2 disp 50% 196.
3 disp 75% 326
4 hp 25% 96.5
5 hp 50% 123
6 hp 75% 180
7 drat 25% 3.08
8 drat 50% 3.70
9 drat 75% 3.92
10 wt 25% 2.58
11 wt 50% 3.32
12 wt 75% 3.61
由于您的输入是 data.frame,您的输出也是如此,您也可以使用 dplyr。
library(dplyr) # version >= 1.0.0
df[3:6] %>%
summarise(across(everything(), quantile, prob = c(0.25,0.50,0.75)),
quantiles = paste0("q", c("0.25","0.50","0.75")))
disp hp drat wt quantiles
1 120.825 96.5 3.080 2.58125 q0.25
2 196.300 123.0 3.695 3.32500 q0.50
3 326.000 180.0 3.920 3.61000 q0.75
如果您愿意,可以通过在末尾添加以下内容以长格式重新排列:
%>% tidyr::pivot_longer(-quantiles)
# A tibble: 12 x 3
quantiles name value
<chr> <chr> <dbl>
1 q0.25 disp 121.
2 q0.25 hp 96.5
3 q0.25 drat 3.08
4 q0.25 wt 2.58
5 q0.50 disp 196.
6 q0.50 hp 123
7 q0.50 drat 3.70
8 q0.50 wt 3.32
9 q0.75 disp 326
10 q0.75 hp 180
11 q0.75 drat 3.92
12 q0.75 wt 3.61
要整理,可以随时使用dplyr::arrange
【讨论】: