我正在尝试合并两个相同长度的向量,其中向量“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)]
答案 0 :(得分:3)
与a
对应的is.na(a)
的值应替换为与b
的否定相对应的is.na(b)
值。在这里,我定义了一个新的向量d
,以便不会覆盖原始向量a
或b
。
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
不出所料,Reduce
比unlist
慢得多。 Map
仅略慢于mapply
。但是Reduce
更为普遍适用,而unlist
实际上只能处理这种特殊情况。