R - 根据可用值选择列

时间:2014-03-27 13:08:56

标签: r vectorization logical-operators idiomatic

我有x:

x = structure(c(12, 24, NA, 25), .Dim = c(2L, 2L))

> x
     [,1] [,2]
[1,]   12   NA
[2,]   24   25

并希望返回y,其中y等于x第二列中的值(如果值可用),如果不等,则返回第一列中的值。 / p>

这样:

> y
[1] 12 25

我想将解决方案用于大型数组,所以如果有意义,我正在寻找一个矢量化解决方案。

1 个答案:

答案 0 :(得分:3)

ifelse完全符合您的要求:

> ifelse(is.na(x[,2]), x[,1], x[,2])
[1] 12 25

如果速度至关重要(并且您不想弄乱C),您可以尝试:

y <- x[,2]
y[is.na(y)] <- x[is.na(y), 1]

这有效地缩短了ifelse的一些开销。考虑:

set.seed(1)
x <- cbind(sample(1:1e5), sample(c(1:95000, rep(NA, 5000))))
library(microbenchmark)
microbenchmark(
  z <- ifelse(is.na(x[,2]), x[,1], x[,2]),
  {y <- x[,2]; y[is.na(y)] <- x[is.na(y), 1]},
  times=10
)
# Unit: milliseconds
#                                       expr        min  median
# z <- ifelse(is.na(x[, 2]), x[, 1], x[, 2])      30.46   33.06
# y <- x[, 2]; y[is.na(y)] <- x[is.na(y), 1]       5.48    5.77 
identical(y, z)    
# [1] TRUE