【问题标题】:R: combine several apply() function in a pipeR:在一个管道中组合几个 apply() 函数
【发布时间】:2021-05-04 18:35:55
【问题描述】:

我正在使用通用数据集“palmerpenguins”。特别是,我想计算所有数字列的最小值和最大值。我正在使用管道函数。

install.packages("palmerpenguins")
library(palmerpenguins)

penguins_raw %>%
      select_if(is.numeric) %>%
      apply(2, min, na.rm = TRUE) %>%
      apply(2, max, na.rm = TRUE) %>%
      as.data.frame() %>%
      rownames_to_column(var = 'col')

但我收到此错误:

apply(., 2, max, na.rm = TRUE) 中的错误:dim(X) 必须具有正长度

我的疑问是:是否可以在同一管道中组合 2 个 apply() ?我怎样才能做到这一点 ?谢谢你:)

【问题讨论】:

    标签: r


    【解决方案1】:

    如果你一步一步地分解它,它会更容易理解。每列取最小值后的输出为:

    library(dplyr)
    library(palmerpenguins)
    
    penguins_raw %>%
      select_if(is.numeric) %>%
      apply(2, min, na.rm = TRUE)
    
    # Sample Number  Culmen Length (mm)   Culmen Depth (mm) Flipper Length (mm) 
    #          1.00               32.10               13.10              172.00 
    
    #      Body Mass (g)   Delta 15 N (o/oo)   Delta 13 C (o/oo) 
    #            2700.00                7.63              -27.02 
    

    现在,您正在对这个输出应用函数 apply(2, max, na.rm = TRUE),这不是您想要的,因为您想从 penguins_raw 数据集中而不是从上述输出中获取每一列的 max


    如果您使用管道和dplyr 函数,则有专门的函数来执行此类计算。在这种情况下,您可以使用across

    penguins_raw %>%
      summarise(across(where(is.numeric), list(min = ~min(., na.rm = TRUE), 
                                               max = ~max(., na.rm = TRUE))))
    

    或者,如果您使用的是旧版本的 dplyr,请使用 summarise_if

    penguins_raw %>%
      summarise_if(is.numeric, list(min = ~min(., na.rm = TRUE), 
                                               max = ~max(., na.rm = TRUE)))
    

    要将数据转换为 3 列格式,我们可以使用 pivot_longer

    penguins_raw %>%
      summarise(across(where(is.numeric), list(min = ~min(., na.rm = TRUE), 
                                               max = ~max(., na.rm = TRUE)))) %>%
      pivot_longer(cols = everything(), 
                   names_to = c('name', '.value'), 
                   names_sep = '_')
    
    #  name                    min    max
    #  <chr>                 <dbl>  <dbl>
    #1 Sample Number          1     152  
    #2 Culmen Length (mm)    32.1    59.6
    #3 Culmen Depth (mm)     13.1    21.5
    #4 Flipper Length (mm)  172     231  
    #5 Body Mass (g)       2700    6300  
    #6 Delta 15 N (o/oo)      7.63   10.0
    #7 Delta 13 C (o/oo)    -27.0   -23.8
    

    【讨论】:

    • 非常感谢!但是,如果我想从中创建一个包含 3 列的数据框?比如,第一个表示数据框的列,第二个表示它们的最大值,第三个表示最小值,如何分开?
    • @EduardoCabria 我们可以使用pivot_longer 来获取该格式的数据。查看更新的答案。
    猜你喜欢
    • 2017-02-21
    • 2021-07-02
    • 2021-11-12
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多