【发布时间】:2017-08-17 23:36:30
【问题描述】:
我有一个大型(约 20 万行)数据框,其结构如下:
df <-
data.frame(c(1,1,1,1,1), c('blue','blue','blue','blue','blue'), c('m','m','m','m','m'), c(2016,2016,2016,2016,2016),c(3,4,5,6,7), c(10,20,30,40,50))
colnames(df) <- c('id', 'color', 'size', 'year', 'week','revenue')
假设现在是第 7 周,我想将过去 4 周的平均收入与当前一周的收入进行比较。我想做的是在所有标识符都匹配时为该平均值创建一个新列。
df_new <-
data.frame(1, 'blue', 'm', 2016,7,50, 25 )
colnames(df_new) <- c('id', 'color', 'size', 'year', 'week','revenue', 't4ave')
我怎样才能有效地做到这一点?谢谢你的帮助
【问题讨论】:
-
您的
df_new是否应该替换适当的行或附加它?似乎您需要对zoo::rollapply使用分组功能(例如by或dplyr::group_by)。您希望这个新列对于预先存在的行的值是多少? -
理想情况下它会附加现有的行。因此,如果 df$week 的值是 3、4、5、6 或 7,则会创建新列,并针对第 7 周(当前周)中特征的每个唯一排列以及周 = 3 中的每个值计算 t4ave, 4,5,6 会有 t4ave = 0。不过,任何完成类似事情的方法都会有所帮助
-
我逻辑上理解你想要什么,分析上觉得很难处理。我的意思是它破坏了数据的理想性质:您现在不能再假设所有行都具有相同的含义:该行是每周总和,除非同一周有两个(等),在这种情况下其中一个是周数据,一个是4周的汇总,要知道我需要知道汇总列的非汇总值是什么......然后取另一个......你看到我在哪里'我同意这个吗?也许如果这仅用于输出/报告,那么可以,但是...
-
我不确定我是否理解您的担忧。它主要用于报告目的,特别是查看本周与过去 4 周平均值(本周不包括在内)的比较,以确定本周飙升/下降的变量。感谢您迄今为止的帮助和思考。