簡體   English   中英

使用 dplyr 對多列進行分組計算分位數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM