8

我有一个名为 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 技巧,以及使我的整个程序更加优雅。谢谢。

4

1 回答 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
于 2013-11-08T17:48:58.920 回答