[英]Merge two vectors based on index in 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)]
的值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
這里有一些可能產生更多“字面”共鳴的解決方案。 它們具有等效的輸出:
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
實際上只能處理這種特殊情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.