[英]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
列並計算n
的NA
的總值並將其除以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.