问题描述
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创建
它也快了四倍