【问题标题】:R summarise not working with distinct clauseR总结不使用不同的条款
【发布时间】:2022-11-30 19:56:59
【问题描述】:
ACCOUNT = c(M205109, M205109, M201212, M205668, M207954, M208966, M203465, M207622, M201869, M201869)
age = c(20, 20, 18, 29, 21, 19, 19, 23, 22, 22)

我正在使用的代码

library(tidyverse)
library(data.table)
library(dtplyr)
library(lubridate)

age_summary_all <- data %>%
  distinct(ACCOUNT) %>%
  summarise(min = min(age, na.rm=TRUE),
            q1 = quantile(age, 0.25, na.rm=TRUE),
            median = median(age,na.rm=TRUE),
            mean = mean(age,na.rm=TRUE),
            q3 = quantile(age, 0.75, na.rm=TRUE),
            max = max(age, na.rm=TRUE))

我收到此错误:

summarise() 中的错误:!计算 min = min(age, na.rm = TRUE) 时出现问题。由mask$eval_all_summarise()中的错误引起:! 未找到对象“年龄”

真正奇怪的是,如果 distinct 被引用不同列的 group_by 子句替换,那么完全相同的代码运行良好,但我需要对独特的个体进行分析——数据的性质使得个体账户很可能在数据表中有多个条目。因此,对于上面的示例,我希望 summarize 子句的 n = 8。

所有的包绝对是最新的。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    distinct 在这种情况下需要 .keep_all=T

    .keep_all:如果为“TRUE”,则将所有变量保留在“.data”中。如果组合 ‘...’的值不明显,这会保留第一行的值。

    没有.keep_all=T的电话

    library(dplyr)
    
    data %>%
      distinct(ACCOUNT)
    # A tibble: 8 × 1
      ACCOUNT
      <chr>
    1 M205109
    2 M201212
    3 M205668
    4 M207954
    5 M208966
    6 M203465
    7 M207622
    8 M201869
    

    致电.keep_all=T

    data %>% 
      distinct(ACCOUNT, .keep_all=T)
    # A tibble: 8 × 2
      ACCOUNT   age
      <chr>   <dbl>
    1 M205109    20
    2 M201212    18
    3 M205668    29
    4 M207954    21
    5 M208966    19
    6 M203465    19
    7 M207622    23
    8 M201869    22
    
    data %>%
      distinct(ACCOUNT, .keep_all=T) %>%
      summarise(min = min(age, na.rm=TRUE),
                q1 = quantile(age, 0.25, na.rm=TRUE),
                median = median(age,na.rm=TRUE),
                mean = mean(age,na.rm=TRUE),
                q3 = quantile(age, 0.75, na.rm=TRUE),
                max = max(age, na.rm=TRUE))
    # A tibble: 1 × 6
        min    q1 median  mean    q3   max
      <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
    1    18    19   20.5  21.4  22.2    29
    

    数据

    data <- structure(list(ACCOUNT = c("M205109", "M205109", "M201212", "M205668",
    "M207954", "M208966", "M203465", "M207622", "M201869", "M201869"
    ), age = c(20, 20, 18, 29, 21, 19, 19, 23, 22, 22)), class = c("tbl_df",
    "tbl", "data.frame"), row.names = c(NA, -10L))
    

    【讨论】:

      【解决方案2】:

      我认为这就是您要实现的目标:

      account <- c("M205109", "M205109", "M201212", "M205668", "M207954", "M208966", "M203465", "M207622", "M201869", "M201869")
      age <- c(20, 20, 18, 29, 21, 19, 19, 23, 22, 22)
      
      library(dplyr)    
      
      data <- data.frame(account , age)
      
      age_summary_all <- 
        data %>%
        group_by(account) %>%
        summarise(min = min(age, na.rm=TRUE),
                  q1 = quantile(age, 0.25, na.rm=TRUE),
                  median = median(age,na.rm=TRUE),
                  mean = mean(age,na.rm=TRUE),
                  q3 = quantile(age, 0.75, na.rm=TRUE),
                  max = max(age, na.rm=TRUE))
      
      age_summary_all
      
      # A tibble: 8 x 7
        account   min    q1 median  mean    q3   max
        <chr>   <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
      1 M201212    18    18     18    18    18    18
      2 M201869    22    22     22    22    22    22
      3 M203465    19    19     19    19    19    19
      4 M205109    20    20     20    20    20    20
      5 M205668    29    29     29    29    29    29
      6 M207622    23    23     23    23    23    23
      7 M207954    21    21     21    21    21    21
      8 M208966    19    19     19    19    19    19
      

      【讨论】:

        【解决方案3】:

        我们不了解 distinct 的输出。看看这个例子:

        require(tidyverse)
        mtcars %>% distinct(mpg)
        

        产生:

        # A tibble: 25 × 1
             mpg
           <dbl>
         1  21  
         2  22.8
         3  21.4
         4  18.7
         5  18.1
         6  14.3
         7  24.4
         8  19.2
         9  17.8
        10  16.4
        # … with 15 more rows
        # ℹ Use `print(n = ...)` to see more rows
        

        【讨论】:

          猜你喜欢
          • 2021-03-16
          • 2021-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-17
          相关资源
          最近更新 更多