【问题标题】:R merging two dataframes, but only select certain year rows from dateframe 2R合并两个数据框,但仅从数据框2中选择某些年份行
【发布时间】:2021-07-28 19:52:51
【问题描述】:

我有两个数据框,一个是 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 中的所有饮料 2015 必须在 dataframe1 中的 2016 饮料之前插入。

最终结果:

*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  

【问题讨论】:

  • 应该改为2015-31-01 7 drink, 2016-01-01 55 drink 吗?否则为什么2015-31-01 food会插入两个不同的地方?

标签: r dataframe merge match


【解决方案1】:

三个基本帧操作:

  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 类列:

# 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 类对象中时,R 将始终按年-月-日顺序显示它们。如果您希望它显示其他内容,我建议您仅在生成报告时这样做(使用format(Dataframe1$date, format="..."),请参阅?strptime 以获取格式提示)。

【讨论】:

  • 非常感谢您非常详细的解释。必须更改日期格式,以匹配我的计算机设置,即 %Y-%m-%d
  • 很高兴它成功了。 Stack 网站上的规范/礼仪是,当您的问题得到解决时,您accept it。慢慢来,不要急于求成,但是当您确信这解决了它时,请回来这样做。你也可以回到之前的问题,每个问题都有一个答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
相关资源
最近更新 更多