我有一个包含各种识别字段的数据集(让我们称之为f1和f2),日期(分为月份和年份)和数字字段(让我们称之为计数)。我按月和年汇总了数据,现在想要在每行中添加12个字段,显示标识字段匹配的前12个月中每个字段的总计数。为了简化这项任务,我添加了一个显示自2014年初以来月份的字段。
Data.Grouped <- arrange(Data, f1, f2, Year, Month) %>%>
group_by(f1, f2, Year, Month) %>%
summarize(total = sum(counts)) %>%
as.data.frame() %>%
mutate(Age.Since.2014 = (Year - 2014)*12 + Month)
为了提高计算效率,我将只检查前一行。如果我做这样的事情
,这是有效的Data.Grouped.Expanded <- mutate(Data.Grouped, PriorMonth= lag(total, default = 0)
但是,在许多情况下,前一行不包含相同标识字段的前几个月数据(因为数据有很多个洞)。我的直觉是做一个简单的条件。
Data.Grouped.Expanded <- mutate(Data.Grouped, PriorMonth = if(
lag(f1) == f1 &&
lag(f2) == f2 &&
lag(Age.Since.2014) == (Age.Since.2014 - 1))
{lag(total, default = 0)}
警告消息表明它正在尝试立即对整个滞后向量进行条件测试,并且仅对所有行使用第一行的结论。切换到rowwise似乎没有帮助。解决方法似乎是在使用条件而不是使用if。
Data.Grouped.Expanded <- mutate(Data.Grouped, PriorMonth =
(lag(f1) == f1) *
(lag(f2) == f2) *
(lag(Age.Since.2014) == (Age.Since.2014 - 1)) *
lag(total, default = 0)
这仍会导致出现警告消息
(In ==.default(c(0L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, :longer object length is not a multiple of shorter object length)
然而,结果似乎是准确的。
我的问题如下:
错误消息到底是什么意思?
为什么程序在乘以条件时理解我的行意图,而不是在if语句中使用它时
如何将此逻辑包装到引用滞后的函数中,例如:
PriorMonth.N = function(n)
(lag(f1, n) == f1) *
(lag(f2, n) == f2) *
(lag(Age.Since.2014, n) == (Age.Since.2014 - 1)) *
lag(total, n, default = 0)
为了说
mutate(Data.Grouped,
PriorMonth.One = PriorMonth.N(1),
PriorMonth.Two = PriorMonth.N(2),
PriorMonth.Three = PriorMonth.N(3))
等等