在数据子集中排除包含特定列中NA值的行

3

我想要排除一个子集中包含我所选择的某一列的NA值的行。我的调查数据以这种方式组织,比如:

name    idnum   term    type      q2    q3
bob     0321    1       2         0     .
.       .       3       1         5     3
ron     .       2       4         2     1
.       2561    4       3         4     2

当我创建我的R工作空间时,我设置了如下格式:data <- read.csv(..., na.strings='.')。为了分析目的,我按术语和类型创建了子集,比如 set13 <- subset(data, term=1 & type=2)。当我试图进行t检验时,我注意到该函数会抛弃任何NA实例,有效地将我的样本量减半。
对于我的分析,我想排除缺少调查项目响应的行,例如Bob在我的例子中,缺少问题3。但我仍希望包括那些nameidnum列中有一个或多个NA的行。因此,我想选择省略NAs的列。(请记住,这只是一个示例 - 我实际的CSV文件有大约1000行,因此每个子集可能包含100-150行。)
我知道可以使用数据框来完成此操作,但我不确定如何将其纳入到我的给定子集格式中。有没有一种方法可以做到这一点?
3个回答

5

请参考这篇stackoverflow帖子中的答案,查看complete.cases

data[complete.cases(data[,3:6]),]

这将返回第3至6列中所有信息完整的行。

data[complete.cases(data[,c(3,7,8)]),] 这将返回第3、7、8列的完整数据。这是你想要的吗? - Rilcon42
是的,谢谢。我认为这会解决问题,但在我有更多时间处理代码/统计数据之前,我不能确定。 - zh1

3
另一种方法。
data[rowSums(is.na(data[,3:6]))==0,]

3
另一个选择是:
data[!Reduce(`|`, lapply(data[3:6], is.na)),]

你为什么提出这个特定的解决方案?它通常更快还是最佳实践?(了解你的典型回答,我假设它出于某种原因更好) - Rilcon42
@Rilcon42,你的解决方案应该更快,因为它使用了complete.cases。这只是另一个选项。 - akrun

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