首页 > 解决方案 > 为什么这里会出现 NA/NaN 错误,我该怎么办?

问题描述

我的数据如下所示:

library(tidyverse)
df <- tibble(
  Type = c(rep("A", 2), rep("B", 2), rep("A", 2), rep("B", 2)),
  Source = c(rep("X", 4), rep("Y", 4)),
  ID = c(1001:1008),
  January = c(11, 22, 10, 30, NA, NA, NA, NA),
  February = c(10, 42, 15, 27, NA, NA, NA, NA) 
)

(实际上,多年来有更多的列,其中一些在 Y 行中是非 NA 的。但这对我的问题来说是可行的。)

我想进行操纵...

newDF <- df %>%
  group_by(Type, Source) %>%
  summarize(theTotal = sum(January:February, na.rm = TRUE))

...但我得到了错误Error in January:February : NA/NaN argument。我知道为什么会出现此错误:1 月和 2 月在某些行中是 NA。即使二月在这些行中有数字,只要一月仍然是 NA,我也会收到此错误。

我的问题是:1)为什么na.rm = TRUE不足以防止这种情况发生?2)如果有的话,我可以对我的代码做些什么来确保我为 A/B 和 Y 的这些组合得到 0?

标签: rdplyr

解决方案


在这种情况下,我们可能可以使用summarise_at,然后使用sum. 在grouping_by感兴趣的列之后,我们得到了。sum列“一月”到“二月”作为单行。与summarise_at然后再ungroup得到sum

library(dplyr)
df %>%
   group_by(Type, Source) %>%
   summarise_at(vars(January:February), sum, na.rm = TRUE) %>%
   ungroup %>%
   transmute(Type, Source, 
    theTotal = rowSums(select(.,January:February), na.rm = TRUE))
# A tibble: 4 x 3
#  Type  Source theTotal
#   <chr> <chr>     <dbl>
#1 A     X            85
#2 A     Y             0
#3 B     X            82
#4 B     Y             0

或者另一种选择是

library(purrr)
df %>% 
  group_split(Type, Source) %>%
  map_dfr(~ .x %>%
           summarise(Type = first(Type),  Source = first(Source), 
theTotal = select(., January:February) %>% unlist %>% sum(., na.rm = TRUE)))
# A tibble: 4 x 3
#  Type  Source theTotal
#  <chr> <chr>     <dbl>
#1 A     X            85
#2 A     Y             0
#3 B     X            82
#4 B     Y             0

推荐阅读