我需要获取y列中每个1的两侧x列的值和.y中每次出现1之前和之后,窗口分别为1:4和5:8.但是,如果窗口超出了pdf的限制,则返回0.这是一个问题,因为0可能是有效的结果.完整数据具有多个组(id),但希望此repex足以帮助创建可扩展的解决方案.
我以前从未使用过zoo
,因此无法弄清楚如何合并na.rm = TRUE
并返回NA,因为窗口完全在DF范围之外.解决方案不必使用zoo
,但如果可能的话,我更喜欢基于动词的答案.
Data and packages:
library(dplyr)
library(zoo)
set.seed(1)
df <- data.frame(id = rep("A", 40),
x = sample(0:3, 40, replace = TRUE),
y = 0)
df[c(2, 8, 9, 30, 33, 39), "y"] <- 1
What I tried:
w <- 4
df %>%
mutate(bf2 = ifelse(y == 1, rollapply(lag(x, 5), width = w, sum, fill = NA, align = "right", partial = TRUE, na.rm = TRUE), NA),
bf1 = ifelse(y == 1, rollapply(lag(x, 1), width = w, sum, fill = NA, align = "right", partial = TRUE, na.rm = TRUE), NA),
af1 = ifelse(y == 1, rollapply(lead(x, 1), width = w, sum, fill = NA, align = "left", partial = TRUE, na.rm = TRUE), NA),
af2 = ifelse(y == 1, rollapply(lead(x, 5), width = w, sum, fill = NA, align = "left", partial = TRUE, na.rm = TRUE), NA)) %>%
filter(y == 1)
id x y bf2 bf1 af1 af2
1 A 3 1 0 0 3 6
2 A 2 1 5 3 6 1
3 A 1 1 5 5 5 2
4 A 1 1 2 1 5 7
5 A 0 1 1 3 8 4
6 A 1 1 5 7 1 0
Desired output:
id x y bf2 bf1 af1 af2
1 A 3 1 NA 0 3 6
2 A 2 1 5 3 6 1
3 A 1 1 5 5 5 2
4 A 1 1 2 1 5 7
5 A 0 1 1 3 8 4
6 A 1 1 5 7 1 NA