根据R中的索引合并两个向量

时间:2014-10-10 18:32:16

标签: r

我正在尝试合并两个相同长度的向量,其中向量“a”中的NA与向量“b”中的数字对齐,反之亦然:

a <- c(1, NA, 3, NA)
b <- c(NA, 2, NA, 4)

输出应为:

1, 2 ,3, 4

感谢您的帮助!

编辑:我使用的解决方案是

a[is.na(a)] <- b[is.na(a)]

2 个答案:

答案 0 :(得分:3)

a对应的is.na(a)的值应替换为与b的否定相对应的is.na(b)值。在这里,我定义了一个新的向量d,以便不会覆盖原始向量ab

d <- a
d[is.na(d)] <- b[!is.na(b)]
d
# [1] 1 2 3 4

如果您知道NA值从第二个位置开始,您也可以替换分配。

d <- a
d[c(FALSE, TRUE)] <- b[c(FALSE, TRUE)]
d
# [1] 1 2 3 4

答案 1 :(得分:0)

以下是一些可能具有更多“字面”共鸣的解决方案。它们具有相同的输出:

m <- mapply(c, na.omit(a), na.omit(b), SIMPLIFY= FALSE)  ## or,
m <- Map(c, na.omit(a), na.omit(b))

output <- unlist(m)  ## or,
output <- Reduce(c, m) 

这样做首先在na.omit(a)na.omit(b)之间连接对,然后将所有这些对连接在一起。

就性能而言,这是一个快速的基准:

library(microbenchmark)

gc()

a <- (1:1e4)[c(TRUE, NA)]
b <- (1:1e4)[c(NA, TRUE)]

microbenchmark(
  unlist(mapply(c, na.omit(a), na.omit(b), SIMPLIFY= FALSE)),
  unlist(Map(c, na.omit(a), na.omit(b))),
  Reduce(c, mapply(c, na.omit(a), na.omit(b), SIMPLIFY= FALSE)),
  Reduce(c, Map(c, na.omit(a), na.omit(b))),
  times = 100
)

# Unit: milliseconds
# expr       min        lq
# unlist(mapply(c, na.omit(a), na.omit(b), SIMPLIFY = FALSE))  4.476689  5.103025
# unlist(Map(c, na.omit(a), na.omit(b)))  4.475753  4.902474
# Reduce(c, mapply(c, na.omit(a), na.omit(b), SIMPLIFY = FALSE)) 75.974627 82.953051
# Reduce(c, Map(c, na.omit(a), na.omit(b))) 75.919419 82.626217
# median        uq       max neval
# 5.488113  5.723023  10.59291   100
# 5.422528  5.784764  13.04502   100
# 86.082578 89.652660 114.94584   100
# 85.761412 89.550317 158.90629   100

不出所料,Reduceunlist慢得多。 Map仅略慢于mapply。但是Reduce更为普遍适用,而unlist实际上只能处理这种特殊情况。