2017-02-03 4 views
-2

Два входных наборов данных:R: как эффективно заполнить недостающее значение другим набором данных?

A <- data.frame(id = c(1, 2, 3), value = rep(NA, 3)) 
A 
    id value 
    <dbl> <lgl> 
1  1 NA 
2  2 NA 
3  3 NA 

B <- data.frame(id = c(3, 2), value = c(3, 2)) 
B 
    id value 
1 3  3 
2 2  2 

После добавления по доступной стоимости в B к A, ожидается, иметь:

A 
    id value 
    <dbl> <lgl> 
1  1 NA 
2  2 2 
3  3 3 

Это может быть достигнуто с последующим цикл. Однако for-loop в целом очень медленный. Как сделать это более эффективно?

for(i in 1:nrow(A)){ 
    item <- A[i,] 
    print(item) 
    if(is.na(item$value) && (item$id %in% B$id)){ 
    A[i, "value"] <- B[B$id == item$id,]$value 
    } 
} 

Join может решить эту проблему. но требуя правила для разрешения конфликта.

+0

@nrussell, для этого требуется B для перезаписывания A., к какому типу соединения принадлежит это? – HappyCoding

+2

Левое соединение затем объединяется - 'left_join (A, B, by = "id")%>% mutate (значение = coalesce (значение.x, значение.y))%>% select (id, value) '. – nrussell

+0

спасибо. это ответ. – HappyCoding

ответ

-1

Вы можете использовать объединение (dplyr):

library(dplyr) 

A <- data.frame(id = c(1, 2, 3), value = rep(NA, 3)) 
B <- data.frame(id = c(3, 2), value = c(3, 2)) 

A %>% left_join(B, by='id') %>% 
    mutate(value = ifelse(is.na(value.x),value.y,value.x)) 

см комментарий вашего вопроса, чтобы узнать, что объединить данные все о.

+0

спасибо. mutate хорошо работает с объединением для этого случая. – HappyCoding