Почему здесь возникает ошибка NA / NaN и что я могу с этим сделать? - PullRequest
1 голос
/ 11 февраля 2020

Мои данные выглядят так:

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) 
)

(На самом деле столбцов за несколько лет гораздо больше, и некоторые из них не являются NA в строках Y. Но это подойдет для моего вопроса .)

Я хочу сделать манипуляции ...

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

... но я получаю ошибку Error in January:February : NA/NaN argument. Я знаю, почему я получаю эту ошибку: январь и февраль - это NA в некоторых строках. Я получил бы эту ошибку, даже если бы в феврале были числа в этих строках, пока январь все еще был NA.

Мои вопросы: 1) Почему na.rm = TRUE недостаточно, чтобы этого не случилось? 2) Что я могу сделать со своим кодом, чтобы убедиться, что я получаю 0 для этих комбинаций A / B и Y?

1 Ответ

1 голос
/ 11 февраля 2020

В этом случае, вероятно, мы можем использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...