R:每个ID仅具有最近观测值的子集数据

时间:2019-07-04 12:29:09

标签: r aggregate-functions

我目前在作业方面遇到问题。

我们分析了YT趋势数据,其结构如下

我们在行中具有观察值,在列中具有诸如视频ID,类别ID,标题,趋势日期等内容。

任务是每个video_id保留最新的观察结果(视频有时处于趋势状态的几天,我们只需要最新的观察(行)。

到目前为止,我已经尝试过:

newDataframe <- aggregate(trending_date ~ video_id, data=df, FUN=max)

虽然完成了这项工作,但我没有其他所有变量都希望获得所需的趋势日期和ID,因此我考虑将其与旧版本绑定在一起?数据框,但我不知道如何在没有多余的较早观察结果的情况下执行此操作。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我们可以使用ggplot2软件包中的经济学数据来使答案具有可重复性:

library(data.table)

econ <- as.data.table(ggplot2::economics_long)
econ
##             date variable  value      value01
##    1: 1967-07-01      pce  507.4 0.0000000000
##    2: 1967-08-01      pce  510.5 0.0002660008
##    3: 1967-09-01      pce  516.3 0.0007636797
##    4: 1967-10-01      pce  512.9 0.0004719369
##    5: 1967-11-01      pce  518.1 0.0009181318
##   ---                                        
## 2866: 2014-12-01 unemploy 8688.0 0.4739085814
## 2867: 2015-01-01 unemploy 8979.0 0.4968816610
## 2868: 2015-02-01 unemploy 8705.0 0.4752506513
## 2869: 2015-03-01 unemploy 8575.0 0.4649877635
## 2870: 2015-04-01 unemploy 8549.0 0.4629351859

此命令(使用data.table包)获取每个变量的最新行:

econ[order(-date), .SD[1], by=variable]
##    variable       date    value   value01
## 1:      pce 2015-04-01  12158.9 0.9997769
## 2:      pop 2015-04-01 320887.0 1.0000000
## 3:  psavert 2015-04-01      5.6 0.2450331
## 4:  uempmed 2015-04-01     11.7 0.3632075
## 5: unemploy 2015-04-01   8549.0 0.4629352

说明

  • econ表子集
  • order(-date)date列对行进行降序排列(从最新到最旧)
    • 要以升序排序:order(date)
    • 要按多列排序:order(variable, date, etc.)
  • by=variablevariable列分组数据
  • .SD一个 D ata的 S ubset,它是一个特殊的表,使用by参数时可以访问它;它是econ表,但对于variable的每个值都分为一个单独的表
  • .SD[1]获取.SD表的第一行


在您的示例中使用以下命令:

## Convert the data.frame to a data.table
setDT(df)

## Get the most recent observation per video_id
df[order(-trending_date), .SD[1], by=video_id