Взятие count () после group_by () для не пропущенных значений - PullRequest
2 голосов
/ 10 октября 2019

У меня есть некоторые данные с пропущенными значениями (т.е. значениями NA), упрощенный формат приведен ниже (код для ввода в конце):


#>   id   x country
#> 1  1 2.0     USA
#> 2  2 4.0     USA
#> 3  3 3.5     JPN
#> 4  4  NA     JPN

Для каждой страны я хотел бы взятьсреднее значение x и количество используемых значений x (т.е. не NA), поэтому я использовал group_by, и оно работает для mean:

df <- df %>% group_by(country) %>% 
  mutate(mean_x = mean(x, na.rm = TRUE),
        #count_x = count(x)) 
        )

df
#> # A tibble: 4 x 4
#> # Groups:   country [2]
#>      id     x country mean_x
#>   <dbl> <dbl> <fct>    <dbl>
#> 1     1   2   USA        3  
#> 2     2   4   USA        3  
#> 3     3   3.5 JPN        3.5
#> 4     4  NA   JPN        3.5

но когда я пытаюсь добавить count(), я получаю сообщение об ошибке

library(tidyverse)
df <- data.frame(id = c(1, 2, 3, 4),
                  x = c(2, 4, 3.5, NA),
                  country = c("USA", "USA", "JPN", "JPN")
                 )
df
df <- df %>% group_by(country) %>% 
  mutate(mean_x = mean(x, na.rm = TRUE),
        count_x = count(x)) 
        )

df

#> Error in UseMethod("summarise_") : no applicable method for 'summarise_' applied to an 
#> object of class "c('double', 'numeric')"

Мой желаемый результат будет:

#>      id     x country mean_x  count
#>   <dbl> <dbl> <fct>    <dbl>
#> 1     1   2   USA        3     2
#> 2     2   4   USA        3     2
#> 3     3   3.5 JPN        3.5   1
#> 4     4  NA   JPN        3.5   1

Воспроизводимый код ниже:

library(tidyverse)
df <- data.frame(id = c(1, 2, 3, 4),
                  x = c(2, 4, 3.5, NA),
                  country = c("USA", "USA", "JPN", "JPN")
                 )
df
df <- df %>% group_by(country) %>% 
  mutate(mean_x = mean(x, na.rm = TRUE),
        count_x = count(x)) 
        )

df

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Мы также можем создать 'count' с group_by n()

library(dplyr)
df %>% 
    group_by(country) %>% 
    mutate(mean_x = mean(x, na.rm = TRUE)) %>%
    summarise(n = n())
# A tibble: 2 x 2
#  country     n
#  <fct>   <int>
#1 JPN         2
#2 USA         2
1 голос
/ 10 октября 2019

count здесь не правильная функция. Первый аргумент count - это конкретный кадр данных или таблица. Однако то, что вы передаете, является вектором, поэтому вы получаете ошибку. Также count суммирует фрейм данных, так что у вас есть только одна строка на группу. См., Например,

library(dplyr)

df %>% 
  group_by(country) %>% 
  mutate(mean_x = mean(x, na.rm = TRUE)) %>%
  count(country)

#  country     n
#  <fct>   <int>
#1 JPN         2
#2 USA         2

Если вы хотите добавить новый столбец без суммирования, используйте add_count вместо

df %>% 
  group_by(country) %>% 
  mutate(mean_x = mean(x, na.rm = TRUE)) %>%
  add_count(country)

#     id     x country mean_x     n
#  <dbl> <dbl> <fct>    <dbl> <int>
#1     1   2   USA        3       2
#2     2   4   USA        3       2
#3     3   3.5 JPN        3.5     2
#4     4  NA   JPN        3.5     2

Однако обе эти функции не выполняют то, что вынужно. Для подсчета значений не-NA на группу необходимо

df %>% 
  group_by(country) %>% 
  mutate(mean_x = mean(x, na.rm = TRUE), 
         count = length(na.omit(x)))
         #OR
         #count = sum(!is.na(x)))#as @Humpelstielzchen mentioned


#    id     x country mean_x count
#  <dbl> <dbl> <fct>    <dbl> <int>
#1     1   2   USA        3       2
#2     2   4   USA        3       2
#3     3   3.5 JPN        3.5     1
#4     4  NA   JPN        3.5     1
...