将日期序列添加到data.table(R)

将日期序列添加到data.table(R),r,datatable,R,Datatable,我有一个数据表,其中包含以不同频率重复发生事件的地点。将提供最后一个事件的日期以及发生频率 例如: dt # Location Last_Occurrence Frequency # 1: Home 7-19-2018 30 # 2: School 6-6-2018 60 # 3: Moon 1-5-1993 90 我想做的是添加一个新专栏,其中包括2018年底之前每个地点的所有未来活动日期 因此,我想要一张如下所示的桌子: d

我有一个数据表,其中包含以不同频率重复发生事件的地点。将提供最后一个事件的日期以及发生频率

例如:

dt
#    Location Last_Occurrence Frequency
# 1: Home     7-19-2018       30
# 2: School   6-6-2018        60
# 3: Moon     1-5-1993        90
我想做的是添加一个新专栏,其中包括2018年底之前每个地点的所有未来活动日期

因此,我想要一张如下所示的桌子:

dt
#    Location Last_Occurrence Frequency Next_Dates
# 1: Home     7-19-2018       30        7-19-2018
# 2: Home     7-19-2018       30        8-18-2018
# 3: Home     7-19-2018       30        9-17-2018
# 4: Home     7-19-2018       30        10-17-2018
# 5: Home     7-19-2018       30        11-16-2018
# 6: Home     7-19-2018       30        12-16-2018
# 7: School   6-6-2018        60        6-6-2018
# 8: School   6-6-2018        60        8-5-2018
# 9: School   6-6-2018        60        10-4-2018
etc.
我该怎么做呢?我怀疑一个lappy函数会有用,因为我在每个位置上都这样做

我已经知道如何使用“while”循环生成未来日期的向量:

Last_Sample_Date <- Sys.Date() #For testing
increase <- 5 #For testing
NextDate <- Last_Sample_Date+increase
multiplier <- 1  

# Create vector of next sampling dates - updated with each iteration of the while loop
NextDates <- c(Last_Sample_Date, NextDate)

while (year(NextDate) == 2018) {
  multiplier <- multiplier+1
  NextDate <- NextDate+multiplier*increase

  #Add to vector of next sampling dates
  NextDates <- append(NextDates, NextDate)
})

上次样本日期IIUC,从
tidyr

df %>% group_by(Location,Frequency,Last_Occurrence) %>%
      mutate(next_date=Last_Occurrence)%>%
      complete(next_date=seq(from = next_date, to = as.Date("2018-12-31"),by = Frequency))

# A tibble: 10 x 4
# Groups:   Location, Frequency, Last_Occurrence [2]
   Location Frequency Last_Occurrence  next_date
      <chr>     <int>          <date>     <date>
 1     Home        30      2018-07-19 2018-07-19
 2     Home        30      2018-07-19 2018-08-18
 3     Home        30      2018-07-19 2018-09-17
 4     Home        30      2018-07-19 2018-10-17
 5     Home        30      2018-07-19 2018-11-16
 6     Home        30      2018-07-19 2018-12-16
 7   School        60      2018-06-06 2018-06-06
 8   School        60      2018-06-06 2018-08-05
 9   School        60      2018-06-06 2018-10-04
10   School        60      2018-06-06 2018-12-03
df%>%分组依据(位置、频率、最后一次出现)%>%
变异(下一个\u日期=最后一次\u出现)%>%
完成(下一个日期=序号(从=下一个日期,到=截止日期(“2018-12-31”),由=频率)
#一个tibble:10x4
#组:位置、频率、最后一次出现[2]
位置频率上一次\u事件下一次\u日期
1家30 2018-07-19 2018-07-19
2家30 2018-07-19 2018-08-18
3家30 2018-07-19 2018-09-17
4家30 2018-07-19 2018-10-17
5家30 2018-07-19 2018-11-16
6家30 2018-07-19 2018-12-16
7学校60 2018-06-06 2018-06-06
8学校60 2018-06-06 2018-08-05
9学校60 2018-06-06 2018-10-04
10学校60 2018-06-06 2018-12-03

我的带有data.table的版本

library(data.table)

# create example dataset
dt <- data.table(
        location = c("home", "school", "moon"),
        orig_date = as.Date(c("2018-07-19", "2018-06-06", "2015-01-05")),
        freq_days = c(30, 60, 90)
)

# figure out how many new rows are needed
dt[ , rows_needed := length(seq(from=orig_date, to=as.Date("2018-12-31"), by=paste(freq_days,"days"))), by=location]

# expand the data.table to include the new rows
dt <- dt[rep(1:nrow(dt), times=rows_needed)]

# add the dates of occurrence
dt[ , date_of_occurrence := seq(from=orig_date[1], to=as.Date("2018-12-31"), by=paste(freq_days[1],"days")), by=location]

# shift dates of occurrence to get next date
dt[ , next_date := shift(date_of_occurrence, type="lead"), by=location]

# drop rows where next occurrence is after 2018 (should you want this)
dt <- dt[!is.na(next_date)]
库(data.table)
#创建示例数据集

嗨,丹-谢谢你的帮助!我无法让“计算需要多少新行”行正常工作。我很确定我输入的是正确的,但我得到了以下错误:
seq.Date中的错误(from=orig_Date[1],to=as.Date(“2018-12-31”),:“by”NA
知道发生了什么吗?我已经通过运行来测试它:
seq(from=orig_Date[1],to=as.Date(“2018-12-31”),by=paste(freq_days,“days”))
…这非常好。检查您的列freq\u days没有任何类似于
sum(is.na(dt$freq\u days))
的NAs,并检查您是否已附加data.table包。如果问题仍然存在,请将您的代码通过电子邮件发送给我,我会查看。明白了!非常感谢您的帮助!它工作正常:)