R 合并两个数据帧,但只有 select 来自数据帧 2 的特定年份行
R merging two dataframes, but only select certain year rows from dateframe 2
我有两个数据框,一个是 2016-2020 年,一个是 2015-2020 年。我想从 dataframe2 中提取 2015 行并插入到 dataframe1。
Dateframe1 有日期、命中、关键字(与 dataframe2 相同)
合并后的行必须有关键字匹配。因此,dataframe2 中的 2015“food”必须插入到 dataframe1 中的 01.01.2016“food”之前。
Ex: Dataframe1:
*date hits keyword*
2016-01-01 10 food
2016-31-01 5 food
2017-31-01 5 food
2018-31-01 5 food
2018-31-01 5 food
2016-01-01 55 drink
2016-22-01 1 drink
2017-31-05 2 drink
2018-31-01 1 drink
所以我希望将 2015 年包含食物的所有行插入到 dataframe1 中 2016 年食物的上方。喝酒也一样。 dataframe2 中的所有 drink 2015 必须在 dataframe1 中的 2016 drink 之前插入。
最终结果:
*date hits keyword*
**2015-31-01 5 food**
2016-01-01 10 food
2016-31-01 5 food
2017-31-01 5 food
2018-31-01 5 food
2018-31-01 5 food
**2015-31-01 7 food**
2016-01-01 55 drink
2016-22-01 1 drink
2017-31-05 2 drink
2018-31-01 1 drink
三个基本的框架操作:
过滤 Dataframe2
只包含我们想要的行。
Dataframe2[grepl("^2015", Dataframe2$date),]
# date x y
# 2 2015-31-01 5 food
# 3 2015-31-01 5 food
# 4 2015-31-01 5 food
使用 rbind
.
按行组合
Dataframe1 <- rbind(Dataframe2[grepl("^2015", Dataframe2$date),], Dataframe1)
Dataframe1
# date x y
# 2 2015-31-01 5 food
# 3 2015-31-01 5 food
# 4 2015-31-01 5 food
# 1 2016-01-01 10 food
# 21 2016-31-01 5 food
# 31 2017-31-01 5 food
# 41 2018-31-01 5 food
# 5 2018-31-01 5 food
# 6 2016-01-01 55 drink
# 7 2016-22-01 1 drink
# 8 2017-31-05 2 drink
# 9 2018-31-01 1 drink
排序结果数据。
Dataframe1[order(Dataframe1$date),]
# date x y
# 2 2015-31-01 5 food
# 3 2015-31-01 5 food
# 4 2015-31-01 5 food
# 1 2016-01-01 10 food
# 6 2016-01-01 55 drink
# 7 2016-22-01 1 drink
# 21 2016-31-01 5 food
# 31 2017-31-01 5 food
# 8 2017-31-05 2 drink
# 41 2018-31-01 5 food
# 5 2018-31-01 5 food
# 9 2018-31-01 1 drink
我应该注意,这些都使用了无法正确排序的字符串 date
值:它们按字典顺序排序,而不是数字。意识到
20 > 3
# [1] TRUE
"20" > "3"
# [1] FALSE
要做到这一点 正确,列将是正确的 Date
class 列:
# starting with a fresh `Dataframe1`
Dataframe1$date <- as.Date(Dataframe1$date, format = "%Y-%d-%m")
Dataframe2$date <- as.Date(Dataframe2$date, format = "%Y-%d-%m")
## Filter
lims <- as.Date(c("2015-01-01", "2015-31-12"), format = "%Y-%d-%m")
Dataframe2[ lims[1] <= Dataframe2$date & Dataframe2$date <= lims[2], ] # for demo
## Combine
Dataframe1 <- rbind(Dataframe2[ lims[1] <= Dataframe2$date & Dataframe2$date <= lims[2], ], Dataframe1)
## Order
Dataframe1[order(Dataframe1$date),]
请注意,在 Date
class 对象中,R 将始终以年-月-日的顺序显示它们。如果您希望它显示其他内容,我建议您只在报告生成时这样做(使用 format(Dataframe1$date, format="...")
,请参阅 ?strptime
了解格式提示)。
我有两个数据框,一个是 2016-2020 年,一个是 2015-2020 年。我想从 dataframe2 中提取 2015 行并插入到 dataframe1。
Dateframe1 有日期、命中、关键字(与 dataframe2 相同) 合并后的行必须有关键字匹配。因此,dataframe2 中的 2015“food”必须插入到 dataframe1 中的 01.01.2016“food”之前。
Ex: Dataframe1:
*date hits keyword*
2016-01-01 10 food
2016-31-01 5 food
2017-31-01 5 food
2018-31-01 5 food
2018-31-01 5 food
2016-01-01 55 drink
2016-22-01 1 drink
2017-31-05 2 drink
2018-31-01 1 drink
所以我希望将 2015 年包含食物的所有行插入到 dataframe1 中 2016 年食物的上方。喝酒也一样。 dataframe2 中的所有 drink 2015 必须在 dataframe1 中的 2016 drink 之前插入。
最终结果:
*date hits keyword*
**2015-31-01 5 food**
2016-01-01 10 food
2016-31-01 5 food
2017-31-01 5 food
2018-31-01 5 food
2018-31-01 5 food
**2015-31-01 7 food**
2016-01-01 55 drink
2016-22-01 1 drink
2017-31-05 2 drink
2018-31-01 1 drink
三个基本的框架操作:
过滤
Dataframe2
只包含我们想要的行。Dataframe2[grepl("^2015", Dataframe2$date),] # date x y # 2 2015-31-01 5 food # 3 2015-31-01 5 food # 4 2015-31-01 5 food
使用
按行组合rbind
.Dataframe1 <- rbind(Dataframe2[grepl("^2015", Dataframe2$date),], Dataframe1) Dataframe1 # date x y # 2 2015-31-01 5 food # 3 2015-31-01 5 food # 4 2015-31-01 5 food # 1 2016-01-01 10 food # 21 2016-31-01 5 food # 31 2017-31-01 5 food # 41 2018-31-01 5 food # 5 2018-31-01 5 food # 6 2016-01-01 55 drink # 7 2016-22-01 1 drink # 8 2017-31-05 2 drink # 9 2018-31-01 1 drink
排序结果数据。
Dataframe1[order(Dataframe1$date),] # date x y # 2 2015-31-01 5 food # 3 2015-31-01 5 food # 4 2015-31-01 5 food # 1 2016-01-01 10 food # 6 2016-01-01 55 drink # 7 2016-22-01 1 drink # 21 2016-31-01 5 food # 31 2017-31-01 5 food # 8 2017-31-05 2 drink # 41 2018-31-01 5 food # 5 2018-31-01 5 food # 9 2018-31-01 1 drink
我应该注意,这些都使用了无法正确排序的字符串 date
值:它们按字典顺序排序,而不是数字。意识到
20 > 3
# [1] TRUE
"20" > "3"
# [1] FALSE
要做到这一点 正确,列将是正确的 Date
class 列:
# starting with a fresh `Dataframe1`
Dataframe1$date <- as.Date(Dataframe1$date, format = "%Y-%d-%m")
Dataframe2$date <- as.Date(Dataframe2$date, format = "%Y-%d-%m")
## Filter
lims <- as.Date(c("2015-01-01", "2015-31-12"), format = "%Y-%d-%m")
Dataframe2[ lims[1] <= Dataframe2$date & Dataframe2$date <= lims[2], ] # for demo
## Combine
Dataframe1 <- rbind(Dataframe2[ lims[1] <= Dataframe2$date & Dataframe2$date <= lims[2], ], Dataframe1)
## Order
Dataframe1[order(Dataframe1$date),]
请注意,在 Date
class 对象中,R 将始终以年-月-日的顺序显示它们。如果您希望它显示其他内容,我建议您只在报告生成时这样做(使用 format(Dataframe1$date, format="...")
,请参阅 ?strptime
了解格式提示)。