我有一个数据集,它是一个日期列表,后面是一列,其中包含"R"表示常规或"S"表示特殊:
date <- c('01/01', '01/02', '01/03', '01/04', '01/05', '01/06', '01/07', '01/08', '01/09')
day <- c('S', 'S', 'R', 'S', 'R', 'S', 'R', 'R', 'S')
data <- data.frame(date, day)
It looks like this:
date . . . day
01/01. . . S
01/02. . . S
01/03. . . R
01/04. . . S
01/05. . . R
01/06. . . S
01/07. . . R
01/08. . . R
01/09. . . S
....
我现在想添加一个栏,根据日期显示未来7天将有多少"特殊"日子。例如,对于01/01,此列应为3,因为从01/02到01/08,有3个"S"天(01/02、01/04和01/06(。
我正在尝试使用mutate,但我不太确定如何使其工作。非常感谢。
我们可以将"Date"列转换为Date
类,在"Date"上循环,用between
创建一个逻辑索引,其中"Date"栏和"Date"的每个元素以及7天后的逻辑向量,其中"Day"是"S",得到sum
library(dplyr)
library(purrr)
df1$Date <- as.Date(df1$Date, "%m/%d/%Y")
df1 %>%
mutate(nspecial = map_int(Date, ~
sum(df1$Day == 'S' & between(df1$Date, .x + days(1), .x + days(7)))))
或使用base R
sapply(df1$Date, function(x) sum(df1$Day == 'S' &
df1$Date > x & df1$Date <= (x + 7)))
#[1] 3 3 3 2 2 1 1 1 0
数据
df1 <- structure(list(Date = c("01/01/2012", "01/02/2012", "01/03/2012",
"01/04/2012", "01/05/2012", "01/06/2012", "01/07/2012", "01/08/2012",
"01/09/2012"), Day = c("S", "S", "R", "S", "R", "S", "R", "R",
"S")), class = "data.frame", row.names = c(NA, -9L))