我有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
我想将解决方案用于大型数组,所以如果有意义,我正在寻找一个矢量化解决方案。
答案 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