【问题标题】:How to replicate `apply()` using summarise() from dplyr如何使用 dplyr 中的 summarise() 复制`apply()`
【发布时间】:2020-10-12 16:44:49
【问题描述】:

我想知道是否有办法使用summarise() 从tidyverse 获取我的预期输出(如下)?

换句话说,如何让stat2 的输出看起来像EXPECTED_OUTPUT?

library(tidyverse)

th <- read.csv('https://raw.githubusercontent.com/rnorouzian/d/master/ths.csv')

EXPECTED_OUTPUT <- data.frame(t(apply(th, 2, function(x) c(median(x), IQR(x)))))

stat2 <- summarise(th, across(.fns = list(median=median, IQR=IQR))) 

【问题讨论】:

    标签: r function dataframe dplyr tidyverse


    【解决方案1】:

    也许尝试像这样重塑数据:

    library(tidyverse)
    
    th <- read.csv('https://raw.githubusercontent.com/rnorouzian/d/master/ths.csv')
    
    EXPECTED_OUTPUT <- data.frame(t(apply(th, 2, function(x) c(median(x), IQR(x)))))
    
    stat2 <- summarise(th, across(.fns = list(median=median, IQR=IQR))) %>%
      pivot_longer(everything()) %>% separate(name,c('Var','Measure'),sep='_') %>%
      pivot_wider(names_from = Measure,values_from=value)
    

    输出:

    # A tibble: 60 x 3
       Var    median   IQR
       <chr>   <dbl> <dbl>
     1 item1       6     1
     2 item2       5     1
     3 item3       5     1
     4 item4       5     2
     5 item5       6     0
     6 item6       7     2
     7 item7       5     3
     8 item8       7     4
     9 item9       6     5
    10 item10      6     2
    # ... with 50 more rows
    

    另一种选择是:

    #Code 2
    stat2 <- th %>% pivot_longer(everything()) %>%
      group_by(name) %>% summarise(median=median(value), IQR=IQR(value))
    

    输出:

    # A tibble: 60 x 3
       name   median   IQR
       <chr>   <int> <dbl>
     1 item1       6     1
     2 item10      6     2
     3 item11      8    10
     4 item12      1    10
     5 item13      6     2
     6 item14      6     2
     7 item15      6     0
     8 item16      5     2
     9 item17      7     3
    10 item18      7     3
    # ... with 50 more rows
    

    【讨论】:

    • @rnorouzian 我已经添加了一个更新,直接使用 reshape 和 summarise,这样可以看起来更优雅。希望对你有帮助!
    • @rnorouzian 有时重塑数据是获得预期结果的关键。也许我们对循环或其他复杂事物的看法迫使我们尝试复杂的事物,但重塑简化了大量工作!
    【解决方案2】:

    为什么不直接调整原始数据:

    th %>%
      rownames_to_column('id') %>%
      pivot_longer(-id) %>%
      group_by(name) %>%
      summarise(median = median(value),
                IQR = IQR(value)) 
    

    【讨论】:

      【解决方案3】:

      我们可以使用data.table 方法

      library(data.table)
      out <- data.table::transpose(setDT(th)[, lapply(.SD,
             function(x) c(median(x), IQR(x)))], keep.names = 'Var')
      

      或者在一行中使用base R

      aggregate(values ~ ind, stack(th)[2:1], function(x) c(median(x), IQR(x)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-21
        • 2018-10-26
        • 2021-09-30
        • 2016-08-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多