簡體   English   中英

使用dplyr根據分組變量計算列NA

[英]Calculate column NA's based on a grouping variable with dplyr

我找不到任何類似的問題,雖然我懷疑之前沒有發布過這個問題。 我的問題與使用dplyr計算,每列中NA'S的百分比有關


在每個受試者多個觀察的數據集中,不僅計算缺失數據條目的總數(即每列的總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包創建於2019-04-16(v0.2.1)

提前致謝!

另一個dplyr版本是首先group_by subject並找出具有any NA值的組,然后group_by列並計算nNA的總值並將其除以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

評估每個項目和每個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM