某些列的按行 NA 计数 - 按 id 分组

标签 r dplyr multiple-columns rows na

我有一个数据框df如下:

输入

id  na_count    task q1   q2   q3   q4  q5
7   3           a    1    NA   NA   2   NA
7   1           b    1    0    0    NA  0
7   3           c    NA   NA   1    NA  1
9   0           a    1    1    0    2   1
9   1           b    1    0    0    1   NA
9   0           c    1    1    0    1   0
9   1           d    1    0    NA   1   1
3   3           a    1    NA   NA   1   NA
3   1           b    1    1    NA   2   1
1   2           b    1    1    NA   1   NA
1   2           c    1    1    NA   1   NA
1   3           d    NA   NA   1    NA  1
2   4           a    1    NA   NA   NA  NA
2   2           b    1    2    NA   1   NA
2   1           c    1    1    2    NA  2
2   1           d    NA   1    3    3   3
2   0           e    2    2    3    3   4
  1. 我有兴趣添加一个二进制列或标志evidence,它是通过查看每个id的数据来计算的,然后查找该id 满足非 NA 值的最小阈值。

  2. 举个例子,我将最小非 NA 阈值设置为 10。因此,如果对于任何 id 至少有 10 个非 NA 值(跨多行),那么我想要将证据设置为,否则我想将证据设置为

  3. (首选)如果可能,我想使用 na_count 列中非 NA 值的计数,而不是实际计算列 q1 上的 NA :q5

输出

对于阈值为 10 非 NA 的示例,我的输出如下:

id  na_count    task q1   q2   q3   q4  q5  evidence
7   3           a    1    NA   NA   2   NA  no
7   1           b    1    0    0    NA  0   no
7   3           c    NA   NA   1    NA  1   no
9   0           a    1    1    0    2   1   yes
9   1           b    1    0    0    1   NA  yes
9   0           c    1    1    0    1   0   yes
9   1           d    1    0    NA   1   1   yes
3   3           a    1    NA   NA   1   NA  no
3   1           b    1    1    NA   2   1   no
1   2           b    1    1    NA   1   NA  no
1   2           c    1    1    NA   1   NA  no
1   3           d    NA   NA   1    NA  1   no
2   4           a    1    NA   NA   NA  NA  yes
2   2           b    1    2    NA   1   NA  yes
2   1           c    1    1    2    NA  2   yes
2   1           d    NA   1    3    3   3   yes
2   0           e    2    2    3    3   4   yes

部分解决方案

我尝试了以下方法,但它只计算行数,而不是该 id 的多行中的非 NA 值。

library(dplyr)
df = df %>%
       group_by(id) %>%
           mutate(rows = n())

相关帖子

以下帖子相关,但没有解决我的问题How to make n() do not count NAs too in tidyverse? , Taking a count() after group_by() for non-missing valuesCount number of non-NA values by group

dput()

为了编码,我还复制了数据帧的dput()

# dput(df)

structure(list(
id = c(7L, 7L, 7L, 9L, 9L, 9L, 9L, 3L, 3L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), 
na_count = c(3L, 1L, 3L, 0L, 1L, 0L, 1L, 3L, 1L, 2L, 2L, 3L, 4L, 2L, 1L, 1L, 0L), 
task = c("a", "b", "c", "a", "b", "c", "d", "a", "b", "b", "c", "d", "a", "b", "c", "d", "e"), 
q1 = c(1L, 1L, NA, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, NA, 1L, 1L, 1L, NA, 2L), 
q2 = c(NA, 0L, NA, 1L, 0L, 1L, 0L, NA, 1L, 1L, 1L, NA, NA, 2L, 1L, 1L, 2L), 
q3 = c(NA, 0L, 1L, 0L, 0L, 0L, NA, NA, NA, NA, NA, 1L, NA, NA, 2L, 3L, 3L), 
q4 = c(2L, NA, NA, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, NA, NA, 1L, NA, 3L, 3L), 
q5 = c(NA, 0L, 1L, 1L, NA, 0L, 1L, NA, 1L, NA, NA, 1L, NA, NA, 2L, 3L, 4L)), 
row.names = c(NA, -17L), class = "data.frame")

对此的任何帮助将不胜感激,谢谢!

最佳答案

library(tidyverse)

threshold = 10

df %>% group_by(id) %>%
  mutate(evidence = ifelse(n()*5 - sum(na_count) >= threshold, "yes", "no"))

5 来自您拥有的列数,q1:q5。

关于某些列的按行 NA 计数 - 按 id 分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69847487/

相关文章:

r - 根据两列标记第一次出现

html - 在 css 的包装器中使用 2 列的动态高度

r - 如何在尚未导出的 R 包中使用函数?

r - 如何在 r 中创建类似对比的表格

使用另一个数据帧作为 R 中的键替换数据帧中的所有值

r - 有没有办法在保留索引的同时汇总按年份分组的值?

python - 在 Python 中屏蔽 pandas 数据框上的多列

html - 没有回流或孤立边距的延迟加载列图像

R - Shiny UI 层中的源()文件

r - R 中的多元时间序列建模