【问题标题】:Filling missing rows two data frames填充缺失的行两个数据框
【发布时间】:2016-05-11 09:35:40
【问题描述】:

我有两个大型数据集。一个是旧的,第二个和第一个差不多。不同之处在于,与第一个数据集相比,第二个具有新行、更新的 Value 和缺失的行。 我想将所有内容保留在新数据集中,并用旧数据集中存在的缺失行(DateCode 的组合)填充它。顺序并不重要。

旧数据集:

              Date Code Value 
        2015-10-01   1   145
        2015-10-01   1   175 
        2015-11-01   6   112 
        2015-12-01   2   160 
        2016-01-01   6   124
        2016-01-01   6   572
        2016-02-01   5   160 
        2016-02-01   1   574

新数据集:

              Date Code Value 
        2015-10-01   1   145
        2015-10-01   2   1452
        2015-11-01   6   125 
        2015-12-01   2   160 
        2016-01-01   6   1501
        2016-01-01   6   572
        2016-03-01   9   452
        2016-03-01   7   500

输出:

              Date Code Value 
        2015-10-01   1   145
        2015-10-01   2   1452
        2015-11-01   6   125 
        2015-12-01   2   160 
        2016-01-01   6   1501
        2016-01-01   6   572
        2016-03-01   9   452
        2016-03-01   7   500
        2015-10-01   1   175 
        2016-02-01   5   160 
        2016-02-01   1   574

DateCode 没有匹配的组合时,应添加旧数据集中的相应行。 在输出中,最后三行来自旧数据集。我查看了不同的帖子,但没有找到我需要的内容。

【问题讨论】:

    标签: r missing-data


    【解决方案1】:

    你可以这样做

    key.new <- with(newds, interaction(Date, Code, Value))
    key.old <- with(oldds, interaction(Date, Code, Value))
    

    然后

    ind <- match(key.old, key.new, nomatch=0) == 0
    

    为您提供旧数据集中应添加到新数据集中的行 一,如果我正确理解了这个问题。

    > oldds[ind, ]
            Date Code Value
    2 2015-10-01    1   175
    3 2015-11-01    6   112
    5 2016-01-01    6   124
    7 2016-02-01    5   160
    8 2016-02-01    1   574
    

    作为旁注,建议您提供最小可重现性 例如,包括重新创建您正在处理的数据的命令 与例如dput(oldds)dput(newds) 的输出或

    oldds <-
    read.table(text='
              Date Code Value 
        2015-10-01    1   145
        2015-10-01    1   175 
        2015-11-01    6   112 
        2015-12-01    2   160 
        2016-01-01    6   124
        2016-01-01    6   572
        2016-02-01    5   160 
        2016-02-01    1   574
    ', header=TRUE)
    
    newds <-
    read.table(text='
              Date Code Value 
        2015-10-01    1   145
        2015-10-01    2  1452
        2015-11-01    6   125 
        2015-12-01    2   160 
        2016-01-01    6  1501
        2016-01-01    6   572
        2016-03-01    9   452
        2016-03-01    7   500
    ', header=TRUE)
    

    【讨论】:

    • 是的,新数据集中第3行和第5行的值已经更新,应该保留
    【解决方案2】:

    您可以使用 dplyr 库中的 anti_join 函数来查找 old_df 中不存在于 new_df 中的所有行

    df <- anti_join(old_df,new_df,by=c("date","code","value"))
            date code value
    1 2016-01-01    6   124
    2 2016-02-01    1   574
    3 2016-02-01    5   160
    4 2015-10-01    1   175
    5 2015-11-01    6   112
    final_df <- full_join(df,new_df,by=c("date","code","value"))
             date code value
    1  2016-01-01    6   124
    2  2016-02-01    1   574
    3  2016-02-01    5   160
    4  2015-10-01    1   175
    5  2015-11-01    6   112
    6  2015-10-01    1   145
    7  2015-10-01    2  1452
    8  2015-11-01    6   125
    9  2015-12-01    2   160
    10 2016-01-01    6  1501
    11 2016-01-01    6   572
    12 2016-03-01    9   452
    13 2016-03-01    7   500
    

    【讨论】:

    • final_df &lt;- anti_join(oldds,newds,by=c("Date", "Code")) 它几乎可以工作,但它没有检测到这一行 2015-10-01 1 175 只有 Code 发生了变化。此外,我收到此警告消息joining factors with different levels, coercing to character vector
    • 好的,我知道我做了什么。首先,anti_join 只返回部分答案。我将编辑我的答案。
    • 您收到警告的原因是因为您的日期列可能被设置为您可以更改我在日期列上使用 as.character() 的因素
    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    相关资源
    最近更新 更多