首页 > 解决方案 > 如何解决 pmap_dbl 中的 Nan 错误问题,平均在 r

问题描述

我正在尝试(出于测试目的)使用 pmap_dbl (purrr 包)计算平均值,然后返回 NaN。当我传递参数 na.rm=TRUE 时,结果不应该是数字吗?令我困惑的是,使用 sum 函数可以正常工作。

library(tidyverse)

airquality%>%select(Ozone,Wind,Temp, Month, Day)%>%
  filter(is.na(Ozone))%>%
  mutate(Something=pmap_dbl(list(Ozone,Wind,Temp,Month,Day),mean,na.rm=TRUE))%>%
  head(3)%>%as_tibble()

 Ozone  Wind  Temp Month   Day Something
  <int> <dbl> <int> <int> <int>     <dbl>
1    NA  14.3    56     5     5       NaN
2    NA   8.6    69     5    10       NaN
3    NA  16.6    57     5    25       NaN

  airquality%>%select(Ozone,Wind,Temp, Month, Day)%>%
  filter(is.na(Ozone))%>%
  mutate(Something=pmap_dbl(list(Ozone,Wind,Temp,Month,Day),sum,na.rm=TRUE))%>%
  head(3)%>%as_tibble()


  Ozone  Wind  Temp Month   Day Something
  <int> <dbl> <int> <int> <int>     <dbl>
1    NA  14.3    56     5     5      80.3
2    NA   8.6    69     5    10      92.6
3    NA  16.6    57     5    25     104. 

标签: rtidyversenanmeanpurrr

解决方案


问题是mean()它只接受一个值向量,但pmap()单独传递每个值(在这种情况下实际上是长度为 1 的向量),因此要使其工作,首先需要将它们连接起来。在您的尝试mean()中,仅对传递的第一个值(NA)执行了其他值,并且其他值被视为函数的其他参数,因此在这种情况下有效地忽略了,结果是NaN. sum()另一方面,可以单独传递任意数量的向量,这就是它起作用但mean()没有起作用的原因。

airquality %>%
  select(Ozone, Wind, Temp, Month, Day) %>%
  filter(is.na(Ozone)) %>%
  mutate(Something = pmap_dbl(list(Ozone, Wind, Temp, Month, Day), function(...)
    mean(c(...), na.rm = TRUE))) %>%
  head(3) %>% 
  as_tibble()

# A tibble: 3 x 6
  Ozone  Wind  Temp Month   Day Something
  <int> <dbl> <int> <int> <int>     <dbl>
1    NA  14.3    56     5     5      20.1
2    NA   8.6    69     5    10      23.2
3    NA  16.6    57     5    25      25.9

推荐阅读