【问题标题】:Fill only missing values in dataframe with values from another dataframe仅用另一个数据框中的值填充数据框中的缺失值
【发布时间】:2018-05-17 13:48:08
【问题描述】:

我的问题与one 类似。假设我有两个数据框,如下所示:

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

df1val2val3 列中有一些缺失值。我只想用正确匹配替换那些列中的缺失值,根据df2 中的date 匹配。根据我链接的问题,这是使用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

这里的问题是它已经将df1 中的val2 的第三个值替换为df2 中的匹配值,尽管df1 中的第三个值最初并没有丢失。另外,如何使用df2 中的匹配值填充df1 中的所有缺失值,而不是一次只填写一列?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    这是使用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 干净。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 2021-12-10
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      相关资源
      最近更新 更多