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