【发布时间】:2017-08-07 14:33:51
【问题描述】:
我对 R 相当陌生,并且已经阅读了一些教程。我想做的是找到一种根据某些条件将数据连接到自身的好方法。
在这种情况下,我想做的是选择任意长度的延迟并创建一个滚动窗口。例如,如果滞后 = 1 且窗口宽度 = 2,我想将每个月前 1 个月的 2 个月(如果存在)汇总起来。
如果我从这样的数据表开始:
mytable = data.table(Month = c(6, 5, 4, 6, 5), Year = c(2016, 2016, 2016, 2016, 2016), Company = c('Kellog', 'Kellog', 'General Mills', 'General Mills', 'General Mills'), ProducedCereals = c(6, 3, 12, 5, 7), CommercialsShown = c(12, 15, 4, 20, 19))
Month Year Company ProducedCereals CommercialsShown
6 2016 Kellog 6 12
5 2016 Kellog 3 15
4 2016 Kellog 12 4
6 2016 General Mills 5 20
5 2016 General Mills 7 19
包含计算字段的表格可能如下所示:
Month Year Company ProducedCereals CommercialsShown
6 2016 Kellog 15 19
5 2016 Kellog 12 4
4 2016 Kellog NA NA
6 2016 General Mills 7 19
5 2016 General Mills NA NA
我已尝试使用列表宽度的 rollapply(),但它似乎取决于数据是否为常规时间序列。然而,我的不是。它需要按公司分组,并且可能缺少某些行。它还需要根据 Month 和 Year 字段取前 n 行。
我意识到一种解决方法可能是渲染数据,以便为每个公司子集执行操作,并在中间注入几个月缺失的虚拟数据,但我认为可能存在更好的方法。
我尝试了以下方法,它应用了滞后和滚动窗口,但不考虑月份、年份和公司。
newthing <- lapply(mytable[,c('ProducedCereals'),with=F], function(x) rollapply(x, width=list(2:3),sum,align='left',fill=NA))
【问题讨论】:
-
请参阅stackoverflow.com/questions/5963269/… 了解如何制作一个可重现的良好示例(可以将其复制粘贴到新的 R 会话中并运行)。
-
嗯,我已经预料到了输出,我觉得对问题的解释比较简洁,所以你想让我在 R 中添加输入数据吗?你说对了。已编辑
-
好的,谢谢。不知道有人会以多快的速度发布答案,但与此同时:我想非 equi 连接应该可以工作 stackoverflow.com/questions/44406040/… 假设您使用 yearmon 变量而不是两个单独的列。
-
太棒了!我不指望别人为我做这项工作,我只是需要一些关于在哪里寻找的建议。我不知道非 equi 连接,但这看起来很有希望。我还在编辑以提供我尝试过的方法,该方法汇总数据,但不是按月、年和公司。
标签: r dataframe data.table rollapply