将向量减少到R中的常见非NA值

时间:2013-11-22 12:43:12

标签: r vector na

我对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

我正在考虑简单地在循环中浏览矢量,但数据集非常大,所以我希望能更快地解决这个问题...我希望有人可以帮助我...

3 个答案:

答案 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

在我的时间里,这是迄今为止最快的选择,但是如果你能够检测到微差之间的差异,或者你的矢量长度是数百万,那么这一点非常重要,所以我不打算发布基准测试。