填充缺少的行两个数据帧

时间:2016-05-11 09:35:41

标签: r missing-data

我有两个大数据集。一个是旧的,第二个与第一个大致相同。区别在于第二个具有新行,更新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的匹配组合,则应添加旧数据集中的相应行。 在输出中,最后三行来自旧数据集。我没有运气就查看了不同的帖子,找到了我需要的东西。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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