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