我对R很新,所以答案可能很明显,但到目前为止,我只找到了不匹配的类似问题的答案,或者我无法将其转化为我的答案。
要求: 我有两个长度相同的向量,包含数值和NA值,可能看起来像:
[1] 12 8 11 9 NA NA NA
[1] NA 7 NA 10 NA 11 9
我现在需要的是两个向量,它们只包含两个原始向量中不是NA
的值,因此在这种情况下,结果应如下所示:
[1] 8 9
[1] 7 10
我正在考虑简单地在循环中浏览矢量,但数据集非常大,所以我希望能更快地解决这个问题...我希望有人可以帮助我...
答案 0 :(得分:6)
您正在寻找complete.cases
但是您应该将您的矢量放在data.frame中。
dat <- data.frame(x=c(12 ,8, 11, 9, NA, NA, NA),
y=c(NA ,7, NA, 10, NA, 11, 9))
dat[complete.cases(dat),]
x y
2 8 7
4 9 10
答案 1 :(得分:1)
试试这个:
#dummy vector
a <- c(12,8,11,9,NA,NA,NA)
b <- c(NA,7,NA,10,NA,11,9)
#result
a[!is.na(a) & !is.na(b)]
b[!is.na(a) & !is.na(b)]
答案 2 :(得分:1)
R中加上NA
的内容通常为NA
。因此,使用这条信息,您可以做到:
cbind(a, b)[!is.na(a + b), ]
# a b
# [1,] 8 7
# [2,] 9 10
更一般地说,您可以编写如下函数来轻松接受任意数量的向量:
myFun <- function(...) {
myList <- list(...)
Names <- sapply(substitute(list(...)), deparse)[-1]
out <- do.call(cbind, myList)[!is.na(Reduce("+", myList)), ]
colnames(out) <- Names
out
}
使用该功能,用法为:
myFun(a, b)
# a b
# [1,] 8 7
# [2,] 9 10
在我的时间里,这是迄今为止最快的选择,但是如果你能够检测到微差之间的差异,或者你的矢量长度是数百万,那么这一点非常重要,所以我不打算发布基准测试。