我需要获取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

推荐答案

您随时可以在条件中添加判断:

df %>%
  mutate(bf2 = ifelse(y & row_number() > 5, rollapply(lag(x, 5), width = w, sum, fill = NA, align = "right", partial = TRUE, na.rm = TRUE), NA),
         bf1 = ifelse(y & row_number() > 1, rollapply(lag(x, 1), width = w, sum, fill = NA, align = "right", partial = TRUE, na.rm = TRUE), NA),
         af1 = ifelse(y & row_number() + 1 <= n(), rollapply(lead(x, 1), width = w, sum, fill = NA, align = "left", partial = TRUE, na.rm = TRUE), NA),
         af2 = ifelse(y & row_number() + 5 <= n(), 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  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

R相关问答推荐

计算转换的次数

如何在列表的子元素上使用setName

self_函数无法工作--无法子集结束后的列

更新合适的R mgcv::bam模型报告无效类型(关闭).'';错误

更改编号列表的 colored颜色

r—绘制相交曲线

将非重复序列高效转换为长格式

用值序列对行进行子集化,并标识序列开始的列

如果第一个列表中的元素等于第二个列表的元素,则替换为第三个列表的元素

根据日期从参考帧中创建不同的帧

多个过滤器内的一个盒子在仪表板Quarto

在df中保留原始变量和新变量

您是否可以折叠R中的重复行,同时保留基于所选列的值?

R -在先前group_by级别汇总时获取最大大小子组的计数

如何根据R中其他变量的类别汇总值?

在R中使用列表(作为tibble列)进行向量化?

在R中,如何从一系列具有索引名的变量快速创建数据帧?

根据r中另一个文本列中给定的范围对各列求和

使用同一行中的前一个值填充R矩阵中的缺失值

从两个数据帧中,有没有办法计算R中一列的唯一值?