在R中排除空白和NA

20

可能是重复问题:
R-删除数据框中带有NAs的行

我有一个名为sub.new的数据框,其中包含多个列。我试图排除任何包含NA或空格""的单元格。
我尝试使用subset(),但它只能针对特定列条件进行操作。是否有一种方法可以扫描整个数据框并创建一个子集,其中没有单元格是NA空格

在下面的示例中,只应保留第一行:

# ID               SNP             ILMN_Strand   Customer_Strand
ID1234              [A/G]          TOP           BOT
Non-Specific        NSB (Bgnd)     Green
Non-Polymorphic     NP (A)         Red
Non-Polymorphic     NP (T)         Purple
Non-Polymorphic     NP (C)         Green
Non-Polymorphic     NP (G)         Blue
Restoration         Restore        Green

任何建议?谢谢。

2
它们有什么问题?你能给我们一些示例数据吗? - Chase
1
你正在使用向量吗?数据框架?如果是数据框架,如果一行中只有一个元素为空或NA,你希望发生什么?请提供更多细节。 - Dason
我进行了搜索,但是没有成功。 - lusketeer
@user1301840:在谷歌上搜索“R删除带有NA的行”,或者使用这个短语在StackOverflow上搜索,都会给出上述问题作为最佳结果。 - David Robinson
这个问题在stackoverflow上有一些很好的答案,介绍了从数据集中删除NA值的其他方法。 - Bas
2个回答

60

在进一步分析之前,一个好的想法是将所有的“”(空单元格)设置为NA。

如果您从文件中读取输入,将所有的“”转换为NA是一个不错的选择:

foo <- read.table(file="Your_file.txt", na.strings=c("", "NA"), sep="\t") # if your file is tab delimited

如果您已经加载了表格,您可以按照以下步骤操作:
foo[foo==""] <- NA

如果你只想保留没有NA的行,你可以使用na.omit()函数:

foo <- na.omit(foo)

或者保留没有NA的列:

foo <- foo[, colSums(is.na(foo)) == 0] 

它能解决问题,但是它删除了所有行。我想我仍然需要缩小范围到我想要进行NA检查的列。感谢您的帮助。 - lusketeer
1
谢谢您的回答!确实之前已经有人问过类似的问题,但是如果有空单元格而不是NA值,那么这个回答非常有用。 - Simone
请问na.omit是什么?在R 3.1.1中没有na包。 - Léo Léopold Hertz 준영
@LéoLéopoldHertz준영,na.omit()是R基础包中的一个函数。在R中,句号不像Python一样表示函数。 - Matt
1
使用dplyr,可以像这样简洁易读地编写代码:foo %>% na_if("") %>% na.omit - Agile Bean

11

不知道您的数据集具体是什么类型,所以我提供一般性的答案。

x <- c(1,2,NA,3,4,5)
y <- c(1,2,3,NA,6,8)
my.data <- data.frame(x, y)
> my.data
   x  y
1  1  1
2  2  2
3 NA  3
4  3 NA
5  4  6
6  5  8
# Exclude rows with NA values
my.data[complete.cases(my.data),]
  x y
1 1 1
2 2 2
5 4 6
6 5 8

这是否也排除了双引号("")? - lusketeer
不,我建议您首先定义数据集中有哪些类型的NA值。 - Andrej
3
你可以先通过类似于这个操作 my.data[my.data == ""] <- NA 将 "" 值转换为 NA,然后再使用给出的答案。 - Dason
@Andrej 我不太明白"什么类型的NA值",它只显示NA。 - lusketeer
你需要按照@Dason的建议,将所有的""出现都重新编码为NA。 - Andrej
谢谢你的所有帮助,我想我现在可以自己解决了。 - lusketeer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接