使用滞后的条件()

时间:2016-10-16 16:12:18

标签: r dplyr

我有一个包含各种识别字段的数据集(让我们称之为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)

然而,结果似乎是准确的。

我的问题如下:

  1. 错误消息到底是什么意思?

  2. 为什么程序在乘以条件时理解我的行意图,而不是在if语句中使用它时

  3. 如何将此逻辑包装到引用滞后的函数中,例如:

    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)
    
  4. 为了说

    mutate(Data.Grouped, 
        PriorMonth.One = PriorMonth.N(1),
        PriorMonth.Two = PriorMonth.N(2),
        PriorMonth.Three = PriorMonth.N(3))
    

    等等

0 个答案:

没有答案