Заполните только пропущенные значения в фрейме данных значениями из другого фрейма - PullRequest
0 голосов
/ 17 мая 2018

Мой вопрос похож на этот один . Допустим, у меня есть два кадра данных, как показано ниже:

set.seed(5)
df1 <- data.frame(date=as.Date(c('2001-01-01', '2001-02-01', '2001-03-01', '2001-04-01', '2001-05-01')),
                  val1=rnorm(5), val2=c(rnorm(3), NA, NA), val3=c(rnorm(3), NA, NA))

df2 <- data.frame(date=as.Date(c('2001-03-01', '2001-04-01', '2001-05-01')),
                  val2=rnorm(3), val3=rnorm(3))
df1
        date        val1       val2       val3
1 2001-01-01 -0.84085548 -0.6029080 -0.2857736
2 2001-02-01  1.38435934 -0.4721664  0.1381082
3 2001-03-01 -1.25549186 -0.6353713  1.2276303
4 2001-04-01  0.07014277         NA         NA
5 2001-05-01  1.71144087         NA         NA

df2
        date       val2       val3
1 2001-03-01 -0.8017795 -1.0717600
2 2001-04-01 -1.0803926 -0.1389861
3 2001-05-01 -0.1575344 -0.5973131

df1 имеет некоторые пропущенные значения в столбцах val2 и val3. Я хочу заменить только пропущенные значения в этих столбцах на правильное соответствие, соответствующее в соответствии с date из df2. Из вопроса, с которым я связан, вот потенциальное решение с использованием data.table:

library(data.table)
setDT(df1)
setDT(df2)
df1[i = df2, val2 := i.val2, on = .(date)]
df1
         date        val1       val2       val3
1: 2001-01-01 -0.84085548 -0.6029080 -0.2857736
2: 2001-02-01  1.38435934 -0.4721664  0.1381082
3: 2001-03-01 -1.25549186 -0.8017795  1.2276303
4: 2001-04-01  0.07014277 -1.0803926         NA
5: 2001-05-01  1.71144087 -0.1575344         NA

Проблема здесь в том, что он заменил 3-е значение val2 в df1 на соответствующее значение в df2, хотя 3-е значение в df1 изначально не отсутствовало. Кроме того, как я могу заполнить все отсутствующие значения в df1 их соответствующими значениями в df2 вместо того, чтобы делать это по одному столбцу за раз?

1 Ответ

0 голосов
/ 17 мая 2018

Вот одно решение с использованием пакета dplyr:

df1 <- df1 %>%
  left_join(., df2, by = 'date') %>%
  mutate(
    val2 = ifelse(is.na(val2.x), val2.y, val2.x),
    val3 = ifelse(is.na(val3.x), val3.y, val3.x)
    ) %>%
  select(date, val1, val2, val3)

df1
        date        val1       val2       val3
1 2001-01-01 -0.84085548 -0.6029080 -0.2857736
2 2001-02-01  1.38435934 -0.4721664  0.1381082
3 2001-03-01 -1.25549186 -0.6353713  1.2276303
4 2001-04-01  0.07014277 -1.0803926 -0.1389861
5 2001-05-01  1.71144087 -0.1575344 -0.5973131

Наконец, с начальным набором.Блин, я продолжал получать разные результаты!:)

При правильном указании опции coalesce ниже:

df1 %>%
  left_join(., df2, by = 'date') %>%
  mutate(
    val2 = coalesce(val2.x, val2.y),
    val3 = coalesce(val3.x, val3.y)
    ) %>%
  select(date, val1, val2, val3)

Чистее, чем ifelse, наверняка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...