2014-10-10 2 views
0

내가 같은 길이의 두 벡터를 병합하기 위해 노력하고있어 곳의 NA 벡터 "는"벡터 "B"의 번호로 정렬하고 그 반대의 :는 R의 인덱스에 따라 두 벡터를 병합

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

출력은 다음과 같아야합니다.

1, 2 ,3, 4 

감사합니다.

편집 : I 사용한 용액 is.na(a) 대응 a

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

시도한 것을 보여주고 작동하지 않는 것을 설명 할 수 있습니까? – EWit

+0

당신이 게시 한 편집에서''는 정말로 필요하지 않습니다. –

답변

3

값은 is.na(b)의 부정에 대응 b의 값으로 교체해야했다. 여기서 원래 벡터 a 또는 b을 덮어 쓰지 않도록 새 벡터 d을 정의합니다.

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 
+0

바로이 정확한 해결책을 게시하려고 했었습니다. – shadowtalker

+0

완벽한 감사합니다! – Dave

0

"리터럴"공명이 더 많은 해결책이 있습니다. 그들은 동등한 출력이 :이 na.omit(a)na.omit(b)에서 그것을 첫째을 병합 쌍을 무엇

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) 

을하고 함께 모든 쌍을 연결합니다.

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보다 훨씬 느립니다 :

는 지금까지 성능이가는대로, 여기에 빠른 벤치 마크입니다. Mapmapply보다 약간 느립니다. 그러나 Reduce은 훨씬 더 일반적으로 적용 가능하지만 unlist은 실제로이 특별한 경우 만 처리 할 수 ​​있습니다.

+0

이 솔루션은 각 벡터에서 NAs의 수가 동일한 경우에만 작동합니다. – Dave

+0

매우 사실이지만, 이것이 "조합"문제인지 아니면 "NA 작성"문제인지 확실하지 않았습니다. 이것은 분명히 후자가 아닌 전방을 향한 것이다. – shadowtalker

+0

"채우기 in NAs"문제가 아주 많이 있습니다. 사실 내가 바라는 해법은 벡터로부터 NA의 인덱스를 지정하고 b의 값을 삽입하는 것입니다. – Dave

관련 문제