![](/img/trans.png)
[英]How to efficiently calculate multiple quantiles of column z when grouping by columns (x, y)
[英]Calculate quantiles with grouping for multiple columns with dplyr
Tidyverse提供了一個示例,說明如何通過對單個列x
進行分組來計算分位數。 下面,我修改了該示例以包括 z 列,它是字符和缺失值(例如,因此需要使用na.rm=TRUE
)。
我想修改以下修改后的代碼,使其適用於所有數字列(即is.numeric
)
library(tidyverse)
df <- tibble(
grp = rep(c("A","B"), each = 5),
x = c(rnorm(5, -0.25, 1), rnorm(5, 0, 1.5)),
y = c(rnorm(5, 0.25, 1), rnorm(5, 0, 0.5)),
z = letters[1:10],
)
df[3,2] <-NA
df
# A tibble: 10 × 4
grp x y z
<chr> <dbl> <dbl> <chr>
1 A 1.02 -0.653 a
2 A -0.370 -0.185 b
3 A NA -1.49 c
4 A -0.336 0.408 d
5 A -0.0526 1.90 e
6 B 1.45 -0.0769 f
7 B 1.36 -1.11 g
8 B 0.0972 -0.0394 h
9 B -1.72 -0.198 i
10 B -2.50 0.364 j
quibble <- function(x, q = c(0.25, 0.5, 0.75), dropNA = TRUE) {
tibble(x = quantile(x, q, na.rm = dropNA), q = q)
}
df %>%
group_by(grp) %>%
summarise(x = list(quibble(x, c(0.25, 0.75), dropNA = TRUE))) %>%
tidyr::unnest(x)
# A tibble: 4 × 3
grp x q
<chr> <dbl> <dbl>
1 A -0.345 0.25
2 A 0.215 0.75
3 B -1.72 0.25
4 B 1.36 0.75
我的嘗試包括以下內容,靈感來自這里
df %>%
group_by(grp) %>%
summarise(across(everything(), where(is.numeric) ~ quibble(.x, c(0.25, 0.75), dropNA = TRUE))) %>%
tidyr::unnest(.x)
我知道這個頁面包括評論中的 sapply 選項和我無法應用於這種情況的解決方案(多個數字和列、缺失值和分組)。
在這里,我們不需要everything()
和is.numeric
。 此外,在where
表達式和 lambda 表達式之間應該有一個,
library(dplyr)
library(tidyr)
df %>%
group_by(grp) %>%
summarise(across( where(is.numeric), ~ quibble(.x, c(0.25, 0.75),
dropNA = TRUE)), .groups = 'drop') %>%
tidyr::unnest(where(is_tibble), names_repair = 'unique', names_sep = "_")
-輸出
# A tibble: 4 × 5
grp x_x x_q y_x y_q
<chr> <dbl> <dbl> <dbl> <dbl>
1 A 0.00519 0.25 -0.888 0.25
2 A 0.723 0.75 1.09 0.75
3 B -1.54 0.25 0.213 0.25
4 B -0.938 0.75 0.439 0.75
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.