3

Основной массив

df1 <- data.frame(id = c(1,2,3,4,5), dig = c(2,3,NA,5,NA), let = c("a",NA,"c","g",NA))

  id dig  let
1  1   2    a
2  2   3 <NA>
3  3  NA    c
4  4   5    g
5  5  NA <NA>

Массив с новыми значениями

df2 <- data.frame(id = c(2,3,5), dig = c(NA,100,200), let = c("letter1",NA,"letter2"))

  id dig     let
1  2  NA letter1
2  3 100    <NA>
3  5 200 letter2

Нужно по id подшить непустые значения из df2. То есть, результат должен выглядеть так:

  id dig     let
1  1   2       a
2  2   3 letter1
3  3 100       c
4  4   5       g
5  5 200 letter2
  • Совершенно не понятно, то ли используется какая-то двумерная конструкция с элементами разного типа, то ли три массива, которые нужно вывести в столбик. Уточните описание задания. – Vlad from Moscow Sep 30 '15 at 09:43

1 Answers1

4
repl <- which(is.na(df1[1:3, ]), arr.ind=T)
df1[repl] <- df2[repl]

Главное - размерности таблиц (исходной и со значениями на замену) должны совпадать, тут я вручную укоротил df1. UPD Более универсальный вариант от автора вопроса:

 repl <- which(is.na(df1[df1$id %in% df2$id, ]), arr.ind=T) 
 df1[df1$id %in% df2$id, ][repl] <- df2[repl]
Ogurtsov
  • 1,645
  • 1
    Спасибо, работает. Как универсальное решение вроде бы должно подойти такое

    repl <- which(is.na(df1[df1$id %in% df2$id, ]), arr.ind=T) df1[df1$id %in% df2$id, ][repl] <- df2[repl]

    – Oleg Bondar Sep 30 '15 at 16:02
  • Да, так вообще классно получается. – Ogurtsov Sep 30 '15 at 16:18
  • @Ogurtsov Вы можете вынести это отдельным ответом, таким образом обратив на него внимание тех, кто столкнулся с такой-же задачей – Timofei Bondarev Oct 01 '15 at 00:20