如何在没有NA值的data.frame中选择行

时间:2013-11-08 17:35:23

标签: r dataframe

我有一个名为data的数据框。我想创建一个函数f(data,collist)。此函数从数据本身获取数据和列列表,并仅返回数据中的那些行,其中collist中提到的列名称不是NA。我知道它可以使用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的精简数据帧。原因是B或C或两者在第2行和第5行都有NA。我想要一个函数,因为我将使用这个操作很多次。通过这个问题,我将学习一些新的R技巧,以及让我的整个程序更优雅。感谢。

1 个答案:

答案 0 :(得分: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