如何在不包含NA值的数据框中选择行。

8
我有一个名为data的数据框。我想创建一个名为f(data, collist)的函数。此函数接受data和data本身中一列的名称列表,并仅返回那些在collist中提到的列名不是NA的data行。我知道可以使用for循环来完成,但我想不使用for循环来完成。
此外,请告诉我在R中避免循环通常更有效率。
下面是一个示例:
 A   B   C   D
 1   2  NA  NA
 2  NA  NA  NA
NA   3   7   5
NA   4   2  NA
 5   6  NA  NA

如果collist包含B和C,则返回一个行号为1、3、4的缩小数据框。原因是在第2行和第5行中,B或C或两者都有NA值。我需要一个函数,因为我会多次使用这个操作。通过这个问题,我将学习一些新的R技巧,并使整个程序更加优雅。谢谢。


抱歉如果我表述不够清晰。我想只返回那些在collist中所有列都为非NA的行作为数据框。在KDB/Q中,我可以传递索引,因为我认为传递索引号比传递完整的子集数据更有效率,然后使用这些索引,我可以轻松地从KDB/Q的主数据中选择这些索引。不确定在R中哪种方法最优 - 发送索引还是发送子集数据。如果使用索引,如何在主函数中使用该索引提取数据中的行? - Sumit
谢谢!这就是我在寻找的内容。如果我想要删除无穷大或任何数据小于0,该怎么做呢?怎样才能实现这个目标? - Sumit
可能是删除数据框中的NAs行的重复问题。 - plannapus
1个回答

8

看起来您只是在寻找complete.cases。这里有一个例子:

#### SAMPLE DATA

set.seed(1)
m <- matrix(rnorm(20), 5)
m[sample(length(m), 7)] <- NA
mydf <- data.frame(m)
mydf
#           X1         X2        X3          X4
# 1         NA -0.8204684  1.511781 -0.04493361
# 2  0.1836433  0.4874291        NA          NA
# 3 -0.8356286  0.7383247        NA  0.94383621
# 4  1.5952808         NA -2.214700  0.82122120
# 5  0.3295078         NA        NA  0.59390132

#### SAMPLE EXTRACTION

collist <- c("X1", "X2")
mydf[complete.cases(mydf[collist]), collist]
#           X1        X2
# 2  0.1836433 0.4874291
# 3 -0.8356286 0.7383247

@Sumit,你想在这些情况下保留“NA”吗?这是一个非常不同的问题,但如果你在SO上搜索,我相信你会找到一些如何做到这一点的例子。请记住,比较运算符通常会产生“TRUE”和“FALSE”输出,这些输出可以用于对数据进行子集化。 - A5C1D2H2I1M1N2O1R2T1
你的回答只回答了我问题的一部分。我想要所有列(x1,x2,x3,x4),并且行2和行3与你的示例中给出的相同。 - Sumit
@Sumit,请更清晰地表达你的问题。在最后一行中,只需删除第二个“collist”。如果你不明白这是在做什么,那么在深入学习R之前,你需要先了解基本的子集和从R中提取数据的知识。 - A5C1D2H2I1M1N2O1R2T1
好的,已经得到答案。mydf[complete.cases(mydf[collist]),] 可以解决问题。 - Sumit

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