降低一个列r的缺失值的因子水平

时间:2014-12-18 19:47:12

标签: 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

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