【问题标题】:add column with names in lapply function (R software)在 lapply 函数中添加名称列(R 软件)
【发布时间】: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

【问题讨论】:

    标签: r lapply quantile


    【解决方案1】:

    您可以使用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
    

    【讨论】:

      【解决方案2】:

      在一行中包含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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-09
        • 2012-03-17
        • 2015-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-10
        相关资源
        最近更新 更多