我找不到类似的问题,尽管我怀疑以前没有发布过。我的问题与 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创建
谢谢!
答案 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