使用dplyr根据分组变量计算NA的值

时间:2019-04-16 12:22:23

标签: r dplyr

我找不到类似的问题,尽管我怀疑以前没有发布过。我的问题与 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 :但是,这显示了所需的值,因为两个主题(1个 2个)缺少item_1,而第二个主题仅缺少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创建

谢谢!

2 个答案:

答案 0 :(得分:3)

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

prop

答案 1 :(得分:1)

评估每个项目和每个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

或者,如果您希望每个主题的不重复主题的数量和比例为:

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