首页 > 解决方案 > 如何将 NA 从 R 中的 summarise(count = n()) 函数中删除?

问题描述

我有一个数据集,其中包含 4 个组织单位 (org_unit),参与者人数不同,2 个问题 (Q1,Q2) 为 2 度 (1:2)。我想知道每个单位有多少人用 [1] 回答了相应的问题,并将他们除以参与者/单位的总数。

Org_unit <- c(1,1,1,1,2,2,2,3,3,4)
Q1 <-  c(1,2,1,2,1,2,1,2,1,2)
Q2 <- c(-9,-9,-9,-9,-9,-9,-9,-9,-9,-9)

问题是,我的 Q2 仅包含 [-9] 代表无响应。因此,我将 NA 分配给 [-9]。

DF <- data.frame(Org_unit, Q1, Q2)
DF[DF == -9] <- NA
DF

   Org_unit Q1 Q2
1         1  1 NA
2         1  2 NA
3         1  1 NA
4         1  2 NA
5         2  1 NA
6         2  2 NA
7         2  1 NA
8         3  2 NA
9         3  1 NA
10        4  2 NA

接下来我计算了用 [1] 回答 Q1 的人的比例,结果很好。

prop_q1 <- DF %>%
 group_by(Org_unit) %>%
 summarise(count = n(), 
        prop = mean(Q1 == 1))

prop_q1
# A tibble: 4 x 3
  Org_unit count  prop
   <dbl> <int> <dbl>
1        1     4 0.5  
2        2     3 0.667
3        3     2 0.5  
4        4     1 0    

但是,当我为 Q2 运行相同的代码时,每个单元的成员数量相同(计数 = c(1,2,3,4),尽管没有人回答这个问题,我不希望他们注册为参与者,因为他们在技术上没有参与这项研究。

prop_q2 <- DF %>%
  group_by(Org_unit) %>%
  summarise(count = n(), 
        prop = mean(Q2 == 1))
prop_q2
# A tibble: 4 x 3
  Org_unit count  prop
     <dbl> <int> <dbl>
1        1     4    NA
2        2     3    NA
3        3     2    NA
4        4     1    NA

面对 NA 时,有没有办法计算每个单位的正确成员数量?[-9] 谢谢!

标签: rcount

解决方案


鉴于您想跨多个列执行此操作,我认为across()dplyr动词中使用对您来说会更好。我在下面解释解决方案。

Org_unit <- c(1,1,1,1,2,2,2,3,3,4)
Q1 <-  c(1,2,1,2,1,2,1,2,1,2)
Q2 <- c(1,-9,-9,-9,-9,-9,-9,-9,-9,-9) #Note one response

df <- tibble(Org_unit, Q1, Q2)

df %>%
    mutate(across(starts_with("Q"), ~na_if(., -9))) %>%
    group_by(Org_unit) %>%
    summarize(across(starts_with("Q"),
        list(
            N = ~sum(!is.na(.)),
            prop = ~sum(. == 1, na.rm = TRUE)/sum(!is.na(.)))
    )) 
# A tibble: 4 x 5
  Org_unit  Q1_N Q1_prop  Q2_N Q2_prop
*    <dbl> <int>   <dbl> <int>   <dbl>
1        1     4   0.5       1       1
2        2     3   0.667     0     NaN
3        3     2   0.5       0     NaN
4        4     1   0         0     NaN

首先,我们采用数据框(我创建为 tibble)并替换以大写“Q”开头的所有列NA的所有值。-9这会将所有问题列转换为以NAs 代替-9s。

其次,我们按组织单元分组,然后使用两个函数进行汇总。第一个对问题的回答不是 NA 的所有值求和。该字符串_N将附加到具有这些值的列。第二个计算比例并将_prop附加到值。


推荐阅读