通过R中的ID识别数据帧中的任何NA

问题描述

如果我有一个像这样的数据框

df <- data.frame(ID = c("12","12","13","14","14"),Q1 = c(NA,"b",NA,"a","a"),Q2 = c(NA,"b"),Q3 = c(NA,"b"))

我如何识别具有ANY NA的ID?我只需要一个ID。

我需要的是 12 13

我的数据框非常大,有些ID缺少许多值,而另一些ID却没有一个。我可以肯定地知道,如果一行(Q1,Q2或Q3)的值缺失,则其中三个将具有NA。所有行都有ID,该列中没有NA。

解决方法

尝试使用base R的{​​{1}}方法来计算rowSums()的数量。之后,NA用于标识行:

which()

输出:

#Code
df[which(rowSums(is.na(df[,-1]))>0),]

或者,如果您只想要ID,则可以使用以下代码:

  ID   Q1   Q2   Q3
1 12 <NA> <NA> <NA>
3 12 <NA> <NA> <NA>
5 13 <NA> <NA> <NA>

输出:

#Code2
unique(df[which(rowSums(is.na(df[,1])
,

您还可以使用完全符合您需求的complete.case取反:

一个逻辑向量,指定在整个序列中哪些观测值/行没有缺失值。

df <- data.frame(ID = c("12","12","13","14","14"),Q1 = c(NA,"b",NA,"a","a"),Q2 = c(NA,"b"),Q3 = c(NA,"b"))


df[!complete.cases(df),1]
#> [1] "12" "12" "13"


microbenchmark::microbenchmark(df[which(rowSums(is.na(df[,1],df[!complete.cases(df),1])
#> Unit: microseconds
#>                                        expr  min   lq   mean median   uq   max
#>  df[which(rowSums(is.na(df[,-1])) > 0),1] 30.0 31.2 36.600   31.7 32.5 249.4
#>                  df[!complete.cases(df),1]  7.2  7.8  9.345    8.1  8.5  39.9
#>  neval cld
#>    100   b
#>    100  a

reprex package(v0.3.0)于2020-09-10创建

它也快了四倍