【问题标题】:Calculate column NA's based on a grouping variable with dplyr使用 dplyr 根据分组变量计算列 NA
【发布时间】:2019-04-16 12:22:23
【问题描述】:

我找不到任何类似的问题,尽管我怀疑以前没有发布过。我的问题与 Calculate using dplyr, percentage of NA'S in each column.


在每个受试者有多个观察值的数据集中,不仅可以计算缺失数据条目的总数(即每列的总 NA),还可以计算 有多少 受试者的缺失数据某种。

例如,在数据集中 db(见下文)item_1 缺少 2 个主题,item_2 缺少 1 个主题。

编辑 1: 我感兴趣的是每个项目有多少受试者(任何)缺失值。即使在item_2 中,对于 1 号主题有两个缺失的观测值,这也应该算作 1,因为它仍然是同一个主题。

library("dplyr")

db <- data.frame(
  subject = c(1, 1, 1, 2),
  item_1 = c(NA, 2, 3, NA),
  item_2 = c(1, NA, NA, 4)
)
db
#>   subject item_1 item_2
#> 1       1     NA      1
#> 2       1      2     NA
#> 3       1      3     NA
#> 4       2     NA      4

到目前为止,我的方法是将 cbind 的所有单个计算合并到一个新的 data.frame 中,但这很快就会变得混乱(列更多)并且肯定编码不好。

编辑 1:但是,这显示了所需的值,因为 item_1 缺少两个主题(1 2),而 item_2 仅缺少 1 个主题(主题 2)。

cbind(
  db %>%
    filter(is.na(item_1)) %>%
    summarise(na_item_1 = n_distinct(subject)),
  db %>%
    filter(is.na(item_2)) %>%
    summarise(na_item_2 = n_distinct(subject))
)
#>   na_item_1 na_item_2
#> 1         2         1

问题dplyr 中是否有计算方法?

理想情况下,我还想在某处添加缺失比例(如下例所示):

data.frame(
  type = c("n", "proportion"),
  na_item_1 = c(2, 1.0),
  na_item_2 = c(1, 0.5)
)
#>         type na_item_1 na_item_2
#> 1          n       2.0       1.0
#> 2 proportion       1.0       0.5

reprex package (v0.2.1) 于 2019-04-16 创建

提前致谢!

【问题讨论】:

  • 为什么 item_2 有 1 个缺失值?
  • 这是关于主题而不是价值观。我的意思是 item_2 缺少 1 个主题(主题号 2)的值。我会尽量在帖子中更清楚地说明这一点。
  • 感谢您指出@RonakShah。这是错误的。它应该是 1.0,因为 2 个主题中有 2 个在 item_1 中缺失。有问题已更正。

标签: r dplyr


【解决方案1】:

另一个dplyr 版本是首先group_by subject 并找出具有any NA 值的组,然后是group_by 列并计算NAs 的总值n并将其除以 subject 的总唯一值得到 prop

library(dplyr)
library(tidyr)

db %>%
  group_by(subject) %>%
  summarise_all(~any(is.na(.))) %>%
  ungroup() %>%
  select(-subject) %>%
  gather() %>%
  group_by(key) %>%
  summarise(n = sum(value), 
            prop = n/n_distinct(db$subject))

#   key       n  prop
#   <chr>  <int> <dbl>
#1 item_1     2   1  
#2 item_2     1   0.5

【讨论】:

  • 一个不错的解决方案。仅针对不经常使用它的人,gather() 来自tidyr 而不是dplyr
【解决方案2】:

评估每个项目和每个 ID 的 NA 数量的不同 tidyverse 可能性可能是:

db %>%
 gather(var, val, -subject) %>%
 group_by(var, subject) %>%
 summarise(val = sum(is.na(val))) %>%
 spread(var, val)

  subject item_1 item_2
    <dbl>  <int>  <int>
1       1      1      2
2       2      1      0

或者如果你想要NA的总数和每个ID的NA比例:

db %>%
 gather(var, val, -subject) %>%
 group_by(subject) %>%
 summarise(count = sum(is.na(val)),
           proportion = sum(is.na(val))/n())

  subject count proportion
    <dbl> <int>      <dbl>
1       1     3        0.5
2       2     1        0.5

或者,如果您只想要每个项目的 NA 的数量和比例:

bind_rows(db %>%
 select(-subject) %>%
 gather(var, val) %>%
 group_by(var) %>%
 summarise(val = sum(is.na(val))) %>%
 spread(var, val) %>%
 mutate(type = "count"),
 db %>%
 select(-subject) %>%
 gather(var, val) %>%
 group_by(var) %>%
 summarise(val = sum(is.na(val))/n()) %>%
 spread(var, val) %>%
 mutate(type = "proportion"))

  item_1 item_2 type      
   <dbl>  <dbl> <chr>     
1    2      2   count     
2    0.5    0.5 proportion

或者,如果您想要每个项目具有 NA 的唯一主题的数量和比例:

bind_rows(db %>%
 gather(var, val, -subject) %>%
 filter(is.na(val)) %>%
 group_by(var) %>%
 summarise(val = n_distinct(subject)) %>%
 spread(var, val) %>%
 mutate(type = "count"),
 db %>%
 gather(var, val, -subject) %>%
 group_by(var) %>%
 mutate(n = n_distinct(subject)) %>%
 filter(is.na(val)) %>%
 group_by(var) %>%
 summarise(val = first(n_distinct(subject)/n)) %>%
 spread(var, val) %>%
 mutate(type = "proportion"))

  item_1 item_2 type      
   <dbl>  <dbl> <chr>     
1      2    1   count     
2      1    0.5 proportion

【讨论】:

  • 请查看我的问题中的编辑。我希望现在更清楚了。
猜你喜欢
  • 2019-04-26
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多