我有一个df
,其变量名称如下
id indexDate eventDate1 eventDate2 V1 V2 V3 ....... V365
对于(eventDate1 - indexDate)
到(eventDate2 - indexDate)
的日期范围,我想在V1 to V365
列中标记出现日期。
每个V
代表indexDate之后的天数。
例如:
如果:
indexDate is 1/1/2017
eventDate1 is 1/3/2017 (= Day 2)
eventDate2 is 1/5/2017 (= Day 4),
然后:
V2-V4
将被赋值为1,其余V~为0。
如果有更好的方法,请随时告诉我!
感谢。
答案 0 :(得分:2)
这有效 -
library(dplyr)
library(tidyr)
# Make fake data
dates <- data.frame(id = 1:10,
indexDate = rep(as.Date("17/01/01"), 10),
eventDate1 = as.Date(paste0("17/01/", 1:10)),
eventDate2 = as.Date(paste0("17/01/", 16:25)))
# Step through this to understand what's going on
dates[rep(row.names(dates), 365), ] %>%
arrange(id) %>%
mutate(Day = rep(1:365, nrow(dates)),
Flag = ifelse(Day <= as.numeric(eventDate2 - indexDate) &
Day > as.numeric(eventDate1 - indexDate), 1, 0)) %>%
# move to long format
spread(Day, Flag)
我玩了paste0("V", Day)
,但传播无序。使用此列约定,您可以使用反向标记`。
dates %>% select(`1`, `2`, `3`)