【问题标题】:How to exclude NA values from being counted in dplyr summarize()? [duplicate]如何在 dplyr summarise() 中排除 NA 值? [复制]
【发布时间】:2020-07-27 04:51:09
【问题描述】:

我有一个只有 NA 值的数据集,我正在尝试生成一个表格,显示该特定数据集 100% 缺失。

但输出显示 NA 值同时计为“1”和“0”。此代码适用于不包含缺失值的不同数据子集。为什么这个数据集不一样?

t1 <- data.frame(characteristic = rep(NA, 5), year = sample(x = 1990:1995, size = 100, replace = TRUE))

t1 %>% 
  select(YEAR, CHARACTERISTIC) %>%
  group_by(YEAR) %>% 
  mutate(YES = length(CHARACTERISTIC[CHARACTERISTIC == "1"]),
         NO = length(CHARACTERISTIC[CHARACTERISTIC == "0"]),
         COUNT = n(), 
         MISSING = sum(is.na(CHARACTERISTIC))) %>% 
  summarize(CHARACTERISTIC = paste(round(first(YES / COUNT) * 100, 2), "%"),
            NO_CHARACTERISTIC= paste(round(first(NO / COUNT) * 100, 2), "%"),
            MISSING = paste(round(first(MISSING / COUNT) * 100, 2), "%"))

【问题讨论】:

    标签: r dplyr na


    【解决方案1】:

    length 与 (==) 与 NA 比较时返回 NA,当您使用 NA 对向量进行子集化时,它返回 NA,因此 NA 是在 length 中计算的。

    检查这个例子:

    x <- c(1:3, NA, 2:3, NA)
    length(x)
    #[1] 7
    
    x == 3
    #[1] FALSE FALSE  TRUE    NA FALSE  TRUE    NA
    x[x == 3]
    #[1]  3 NA  3 NA
    length(x[x == 3])
    #[1] 4
    

    在这里,您期望输出为 2,但由于 NA 值,它给出了 4。也许,您可以使用:

    length(na.omit(x[x == 3])) 
    #[1] 2
    

    但是在逻辑值上使用sum 非常复杂。

    sum(x == 3, na.rm = TRUE)
    #[1] 2
    

    那就试试吧:

    library(dplyr)
    t1 %>% 
      group_by(year) %>% 
      mutate(YES = sum(characteristic == "1", na.rm = TRUE),
             NO = sum(characteristic == "0", na.rm = TRUE))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 2015-06-05
      • 2014-12-27
      • 2015-11-21
      • 1970-01-01
      相关资源
      最近更新 更多