【问题标题】:Combining functions in purrr::map合并 purrr::map 中的函数
【发布时间】:2020-01-04 10:31:46
【问题描述】:

我正在使用 R 中的内置空气质量数据集 下面是我的代码

f <- function(x){
             list(sd(x),median(x))
           }

 sapply(airquality,f)   

#output
  Ozone    Solar.R Wind     Temp     Month    Day     
 33.27597 91.1523 3.557713 9.529969 1.473434 8.707194
 31       207     9.7      79       7        16      

我想要 same 输出但使用 purrr::map。 我试过了-

map_dbl(airquality,.f)

但这不起作用。 如何修复此代码?

【问题讨论】:

  • 有多种方法可以做到这一点。您能否发布一个示例,您希望结果如何。因此,只需手动输入您希望 R 打印结果的方式
  • 已编辑说明所需结果的问题

标签: r dplyr purrr


【解决方案1】:

您可以根据您想要的输出方式使用map_df/map_dfc 应用多个函数。

purrr::map_df(airquality, ~list(med = median(.x, na.rm = TRUE), sd = sd(.x, na.rm = TRUE)))

为了得到完全如图所示的预期输出,我们可以使用

purrr::map(airquality, f) %>%
    purrr::transpose() %>%
    dplyr::bind_rows()

# A tibble: 2 x 6
#  Ozone Solar.R  Wind  Temp Month   Day
#  <dbl>   <dbl> <dbl> <dbl> <dbl> <dbl>
#1  33.3    91.2  3.56  9.53  1.47  8.71
#2  31     207    9.7  79     7    16   

【讨论】:

  • 缺少列名
  • @YOLO 更新了答案。现在应该可以了吧?
【解决方案2】:

基础R:

sapply(airquality, function(x){

    list(std_dev = sd(x, na.rm = TRUE), med = median(x, na.rm = TRUE))

  }
)   

【讨论】:

    【解决方案3】:

    你可以这样做:

    airquality %>% summarise_all(.funs = list(m = median, s = sd))
    

    您会得到一个数据集,其中的新列名称类似于 VAR_X,其中 VAR 是旧列名称之一,Xms,具体取决于该列是否为中位数或 SD。

      Ozone_m Solar.R_m Wind_m Temp_m Month_m Day_m  Ozone_s Solar.R_s   Wind_s
    1      31       207    9.7     79       7    16 33.27597   91.1523 3.557713
        Temp_s  Month_s    Day_s
    1 9.529969 1.473434 8.707194
    

    【讨论】:

    • 谢谢。但我想使用 purrr::map 来做到这一点。有什么方法可以使用地图吗?
    【解决方案4】:

    我们可以在base R中使用lapply

    do.call(cbind, lapply(airquality, function(x) c(std_dev = sd(x, na.rm = TRUE),
                 med = median(x, na.rm = TRUE))))
    #       Ozone   Solar.R     Wind     Temp    Month      Day
    #std_dev 32.98788  90.05842 3.523001  9.46527 1.416522  8.86452
    #med     31.50000 205.00000 9.700000 79.00000 7.000000 16.00000
    

    或使用data.table

    library(data.table)
    as.data.table(airquality)[, lapply(.SD, function(x)
       c(std_dev = sd(x, na.rm = TRUE), med = median(x,  na.rm = TRUE)))]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-08
      • 2022-01-23
      • 2019-12-20
      • 2021-08-01
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多