填充缺失的行两个数据框

Filling missing rows two data frames

我有两个大数据集。一个是旧的,第二个和第一个差不多。不同之处在于,与第一个数据集相比,第二个数据集有新行、更新 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 的匹配组合时,应添加旧数据集中的相应行。 在输出中,最后三行来自旧数据集。我查看了不同的帖子,但没有找到我需要的东西。

你可以做到

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)

您可以使用 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