我目前在作业方面遇到问题。
我们分析了YT趋势数据,其结构如下
我们在行中具有观察值,在列中具有诸如视频ID,类别ID,标题,趋势日期等内容。
任务是每个video_id保留最新的观察结果(视频有时处于趋势状态的几天,我们只需要最新的观察(行)。
到目前为止,我已经尝试过:
newDataframe <- aggregate(trending_date ~ video_id, data=df, FUN=max)
虽然完成了这项工作,但我没有其他所有变量都希望获得所需的趋势日期和ID,因此我考虑将其与旧版本绑定在一起?数据框,但我不知道如何在没有多余的较早观察结果的情况下执行此操作。
非常感谢您的帮助!
答案 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=variable
按variable
列分组数据.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