簡體   English   中英

根據R中的索引合並兩個向量

[英]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以免覆蓋原始向量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

這里有一些可能產生更多“字面”共鳴的解決方案。 它們具有等效的輸出:

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實際上只能處理這種特殊情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM