首页 > 解决方案 > R:每个 ID 只有最近观察的子集数据

问题描述

我目前有一个任务问题。

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

我们在行中有观察结果,在列中有视频 ID、类别 ID、标题、趋势日期等内容。

任务是保持每个 video_id 的最新观察结果(视频有时会出现几天的趋势,我们只需要最新的观察结果(行)。

到目前为止,我尝试过:

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

虽然它完成了工作,但我没有所有其他变量期望我需要的趋势日期和 ID,因此我考虑将它与旧的绑定在一起?数据框,但我不知道如果没有不需要的旧观察,我应该如何做到这一点。

我非常感谢任何帮助!

标签: raggregate-functions

解决方案


我们可以使用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一个“数据的子集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

推荐阅读