【问题标题】:Numbers of missing values by group in RR中按组划分的缺失值数量
【发布时间】:2020-08-28 19:55:59
【问题描述】:

我有一个包含多个缺失值 (NA) 的数据框,在名为 Group 的列中分为多个组 (A、B、C、D、E、F)。我正在尝试在 R 中对其进行分析。

我想将属于每个组的行/记录数制成表格,或者更好的是每个组内的行/记录的比例(即该组内的行/记录总数),它们具有:> = 1 NA(即至少 1 个缺失值),>=2 NA,>=3 NA,>=4 NA,依此类推(最多 n NA,我将预先定义)。

我想只使用基本 R 和 dplyr。我想一个解决方案将从df %>% group_by(Group) 开始,但我不确定从那里去哪里。

有什么想法吗?

编辑:让我们以虹膜作为数据:

iris0 <- iris
set.seed(101)
iris0[sample(150,40),1] <- NA
iris0[sample(150,40),2] <- NA
iris0[sample(150,40),3] <- NA
iris0[sample(150,40),4] <- NA

此时我想要(在提供max_n=7 之后)一个类似于以下的表格

                1 NAs 2 NAs 3 NAs 4 NAs
1   setosa      30    13    3   0   0   0   0
2   versicolor  40    18    5   0   0   0   0
3   virginica   36    13    2   0   0   0   0
4   Total      106    44    10  0   0   0   0
5   (%)       70.67 29.33   6.67    0.00    0.00    0.00    0.00

实际上,我想出了一个使用 rowsums 和 lapply 的方法,但我想知道是否有人可以提供更有效的方法(使用 base R 和 dplyr),例如用聚合什么的。将 lapply 结果拆箱成上述表格也是一大难题。

此外,最好将数字除以每个类中的总记录(对于每个类中的比例)。

【问题讨论】:

标签: r dplyr missing-data


【解决方案1】:

虽然您没有提供数据,但我想您有以下类型的(简化的)问题

Z = data.frame(Group = c("A", "A", "B", "B", "C", "C", "C"), 
               value = c(1, NA, 1, 1, NA, NA, 1))
  Group value
1     A     1
2     A    NA
3     B     1
4     B     1
5     C    NA
6     C    NA
7     C     1

现在您想计算每个组中不为 NA 的条目的比例,对吗?

你可以这样做

aggregate(value ~ Group, 
          data = Z, 
          function(x) {
                       sum(!is.na(x))/length(x)
                       }, 
          na.action = NULL)

并获得结果

  Group     value
1     A 0.5000000
2     B 1.0000000
3     C 0.3333333 

编辑

提供数据后,我们需要稍微调整代码以得出结果。

先做

Test = iris0 %>% 
  dplyr::mutate(NAS = rowSums(is.na(.))) %>% 
  dplyr::group_by(Species) 

然后我们做

aggregate(NAS ~ Species, 
          data = Test, 
          function(x) {
            table(x)
          }
)

到达

     Species NAS.0 NAS.1 NAS.2 NAS.3
1     setosa    20    17    10     3
2 versicolor    10    22    13     5
3  virginica    14    23    11     2

编辑二:

解决您在 cmets 中的其他问题:

(1) 您可以按通常的方式进行索引和提取,例如

Test[Test$NAS == 3 & Test$Species == "virginica"]

(2)我们也可以通过

的方式得到例子的自制累加表
Z = aggregate(NAS ~ Species, 
      data = Test, 
      function(x) {
        table(x)
      }
)
(t(
   apply(Z[,2:dim(Z)[2]], 1, cumsum)
                                    ) 
                                      - 50)*(-1)

结果

      0  1 2 3
[1,] 30 13 3 0
[2,] 40 18 5 0
[3,] 36 13 2 0

当然,这是一个快速修复,但有效。请注意,在一般情况下,您需要将 50 替换为组计数的向量。

(3) 它在 3 个 NA 处停止,因为根本没有更多的列可以容纳更多的 NA。

【讨论】:

  • 恐怕不行。我的数据有几列。我想计算每个类的 rows 数,即(在该行内)至少有 n 个 NA 或更多。我会用数据更新帖子。
  • 我添加了一个完整的可重现示例
  • 我刚刚根据您提供的新规范更新了我的答案。
  • 谢谢。这是一个简洁的答案,但存在一些问题:(1)它不是我可以使用的格式(我如何索引以提取,例如,B 类中具有 2 个 NA 的记录数?)。 (2) 我想要一个累积计数(即大于 1 NA,2 NA,...)。 (3) 桌子是如何决定在 3 个 NA 处停止的?我想自己提供这个......在我的数据上尝试它我注意到它不会在所有 NA 停止时停止(而是在此之前)。
  • 我刚刚更新了答案以回应您的警告。
猜你喜欢
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
相关资源
最近更新 更多