我想删除任何一个因子级别,其中一行包含缺失值
示例:
ID var1 var2
1 1 2
1 NA 3
2 1 2
2 2 4
所以,在这个假设中,剩下的将是:
ID var1 var2
2 1 2
2 2 4
答案 0 :(得分:4)
她可能的data.table
解决方案(对不起@rawr)
library(data.table)
setDT(df)[, if (all(!is.na(.SD))) .SD, ID]
# ID var1 var2
# 1: 2 1 2
# 2: 2 2 4
如果您只想查看var1
,那么
df[, if (all(!is.na(var1))) .SD, ID]
# ID var1 var2
# 1: 2 1 2
# 2: 2 2 4
答案 1 :(得分:3)
假设NAs
列中出现var
,
df[with(df, !ave(!!rowSums(is.na(df[,-1])), ID, FUN=any)),]
# ID var1 var2
#3 2 1 2
#4 2 2 4
或者仅限于var1
df[with(df, !ave(is.na(var1), ID, FUN=any)),]
# ID var1 var2
#3 2 1 2
#4 2 2 4
或使用dplyr
library(dplyr)
df %>%
group_by(ID) %>%
filter(all(!is.na(var1)))
# ID var1 var2
#1 2 1 2
#2 2 2 4
df <- structure(list(ID = c(1L, 1L, 2L, 2L), var1 = c(1L, NA, 1L, 2L
), var2 = c(2L, 3L, 2L, 4L)), .Names = c("ID", "var1", "var2"
), class = "data.frame", row.names = c(NA, -4L))
答案 2 :(得分:3)
这是基础R中的另一个选项。它将检查所有列的NA。
df[!df$ID %in% df$ID[rowSums(is.na(df)) > 0],]
# ID var1 var2
#3 2 1 2
#4 2 2 4
如果您只想签入“var1”栏,您可以这样做:
df[!with(df, ID %in% ID[is.na(var1)]),]
# ID var1 var2
#3 2 1 2
#4 2 2 4
答案 3 :(得分:2)
在data.table
的当前开发版本中,有一个针对data.tables的na.omit
的新实现,它带有cols =
和invert =
个参数。
cols =
允许指定要查找NAs
的列。并且invert = TRUE
会返回NA行,而不是省略它们。
您可以安装devel版本by following these instructions。或者你可以在CRAN等待1.9.6。使用它,我们可以做到:
require(data.table) ## 1.9.5+
setkey(setDT(df), ID)
df[!na.omit(df, invert = TRUE)]
# ID var1 var2
# 1: 2 1 2
# 2: 2 2 4
这是如何运作的:
setDT
通过引用将data.frame转换为data.table。
setkey
按提供的列对data.table进行排序,并将这些列标记为键列,以便我们可以执行连接。
na.omit(df, invert = TRUE)
只提供NA
位置的行。
X[!Y]
通过加入关键列ID
来执行anit-join,并返回与ID = 1
不匹配的所有行(来自Y
)。检查this post以详细了解data.table的连接。
HTH