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  

三个基本的框架操作:

  1. 过滤 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
    
  2. 使用 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
    
  3. 排序结果数据。

    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 了解格式提示)。