【发布时间】:2014-12-18 19:47:12
【问题描述】:
我想删除任何出现的某一行包含缺失值的因子水平
例子:
ID var1 var2
1 1 2
1 NA 3
2 1 2
2 2 4
所以,在这个假设中,剩下的将是:
ID var1 var2
2 1 2
2 2 4
【问题讨论】:
标签: r
我想删除任何出现的某一行包含缺失值的因子水平
例子:
ID var1 var2
1 1 2
1 NA 3
2 1 2
2 2 4
所以,在这个假设中,剩下的将是:
ID var1 var2
2 1 2
2 2 4
【问题讨论】:
标签: r
她可能的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
【讨论】:
假设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))
【讨论】:
这是 base 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
【讨论】:
在data.table 的当前开发版本中,data.tables 有一个新的na.omit 实现,它接受cols = 和invert = 参数。
cols = 允许指定要在其上查找NAs 的列。而invert = TRUE 则返回 NA 行,而不是省略它们。
您可以安装开发版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 进行反连接,并返回所有与ID = 1 不匹配的行(来自Y)。查看this post 详细了解 data.table 的连接。
HTH
【讨论】: