代码之家  ›  专栏  ›  技术社区  ›  Jeremy K.

在group_by()之后对不缺少的值执行count()

  •  1
  • Jeremy K.  · 技术社区  · 5 年前

    我有一些缺少值的数据(即NA值),简化格式如下(末尾输入代码):

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

    对于每个国家,我都想 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
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Ronak Shah    5 年前

    count 这里的功能不对。第一个论点 计数 是特定的数据帧或tibble。但是,传递的是一个向量,因此会得到错误。阿尔索 计数 汇总数据帧,以便每个组只有一行。比如说,

    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