变量n的滞后函数

时间:2018-07-18 07:42:33

标签: r dplyr lag lead

lag中使用dplyr函数时遇到一些问题。这是我的数据集。

ID <- c(100, 100, 100, 200, 200, 300, 300)
daytime <- c("2010-12-21 06:00:00", "2010-12-21 09:00:00", "2010-12-21 13:00:00 ", "2010-12-23 23:00:00", "2010-12-24 02:00:00", "2010-12-25 19:00:00", "2010-12-31 08:00:00")
lagfirstvisit <- c(0, 0, 2, 0, 1, 0, 0) 
table <- cbind(ID, daytime, lagfirstvisit) 
table <- as.data.frame(table)
table$daytime <- as.POSIXct(table$daytime)

我的目标是生成一个新列,其中变量daytime的滞后时间与lagfirstvisit列中指示的数字相同。即如果为lagfirstvisit == 2,则需要特定ID的lag2 daytime值。如果为lagfirstvisit == 0,则意味着保留观察行的原始daytime值。

我的预期结果如下:

ID <- c(100, 100, 100, 200, 200, 300, 300)
daytime <- c("2010-12-21 06:00:00", "2010-12-21 09:00:00", "2010-12-21 13:00:00 ", "2010-12-23 23:00:00", "2010-12-24 02:00:00", "2010-12-25 19:00:00", "2010-12-31 08:00:00")
lagfirstvisit <- c(0, 0, 2, 0, 1, 0, 0) 
result <- c("2010-12-21 06:00:00", "2010-12-21 09:00:00", "2010-12-21 06:00:00", "2010-12-23 23:00:00", "2010-12-23 23:00:00", "2010-12-25 19:00:00", "2010-12-31 08:00:00")
table.results <- cbind(ID, daytime, lagfirstvisit, result) 

当前,我正在使用的代码是:

table <- table %>%  
group_by(ID) %>% 
mutate(result = lag(as.POSIXct(daytime, format="%m/%d/%Y %H:%M:%S", tz= "UTC"), n = as.integer(lagfirstvisit)))

但是,我得到了错误:

  

mutate_impl(.data,点)中的错误:   评估错误:n必须是非负整数标量,而不是长度3的整数。

有没有人知道我该如何解决此问题?非常感谢你!

3 个答案:

答案 0 :(得分:3)

table.results %>%
  group_by(ID) %>%
  mutate(
    result2=mapply(`[`, list(day), row_number() - lagfirstvisit)
  )
# A tibble: 7 x 5
# Groups:   ID [3]
     ID   day lagfirstvisit result result2
  <dbl> <dbl>         <dbl>  <dbl>   <dbl>
1  100.   21.            0.    21.     21.
2  100.   22.            0.    22.     22.
3  100.   23.            2.    21.     21.
4  200.   12.            0.    12.     12.
5  200.   13.            1.    12.     12.
6  300.   19.            0.    19.     19.
7  300.   22.            0.    22.     22.

答案 1 :(得分:1)

    table%>%
      mutate_all(~as.numeric(as.character(.x)))%>%#First ensure all columns are numeric
      mutate(result=day[1:n()-lagfirstvisit])# you can also use row_number() instead of 1:n()

  ID day lagfirstvisit result
1 100  21             0     21
2 100  22             0     22
3 100  23             2     21
4 200  12             0     12
5 200  13             1     12
6 300  19             0     19
7 300  22             0     22

警告:请勿将内置函数名称用作变量名称。例如,您不应该使用名称table,因为这是基于r的函数

编辑:

对于新数据,只要lagfirstvisit是数字,则过程保持不变:

table%>%
   mutate(result=daytime[1:n()-as.numeric(as.character(lagfirstvisit))])
   ID             daytime lagfirstvisit              result
1 100 2010-12-21 06:00:00             0 2010-12-21 06:00:00
2 100 2010-12-21 09:00:00             0 2010-12-21 09:00:00
3 100 2010-12-21 13:00:00             2 2010-12-21 06:00:00
4 200 2010-12-23 23:00:00             0 2010-12-23 23:00:00
5 200 2010-12-24 02:00:00             1 2010-12-23 23:00:00
6 300 2010-12-25 19:00:00             0 2010-12-25 19:00:00
7 300 2010-12-31 08:00:00             0 2010-12-31 08:00:00

答案 2 :(得分:0)

我认为这比当前答案还干净:

table %>%
  group_by(ID, lagfirstvisit) %>%
  mutate(result = dplyr::lag(daytime, n = lagfirstvisit[1])) %>%
  ungroup()

由于已将lagfirstvisit分组,因此所有索引都相同,因此可以使第一个工作正常。