在 lapply 函数中添加带有名称的列(R 软件)

add column with names in lapply function (R software)

我正在使用 lapply 函数来估计数据帧列表中几列的分位数:

stack(lapply(df[3:6], quantile, prob = c(0.25,0.50,0.75), **names = c("q0.25, q0.50, q0.75")**))

它的工作方式与我预期的一样,名称的最后一部分较少,我如何在输出 table 中创建一个列来说明每一行是什么:q0.25、q0.50、q。 075

您可以使用 sapply,它将 return 具有适当名称的矩阵:

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 的解决方案 [我使用 mtcars 作为示例 df <- 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

或者在 long-format 输出中:

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,因此您也可以使用 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