我有两个大数据集。一个是旧的,第二个与第一个大致相同。区别在于第二个具有新行,更新Value
并且与第一个数据集相比缺少行。
我想将所有内容保存在新数据集中,并使用旧数据集中存在的缺失行(Date
和Code
的组合)填充它。订单并不重要。
旧数据集:
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
如果没有Date
和Code
的匹配组合,则应添加旧数据集中的相应行。
在输出中,最后三行来自旧数据集。我没有运气就查看了不同的帖子,找到了我需要的东西。
答案 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