我有一个艰难的时间隔离n-行之前和之后的标记组
我在其他地方找到了一个可以工作的答案,但是被小于行范围的组抛弃了。例如,如果范围是6行,但一组只有5个观察值,则查询将开始包括来自先前组的不相关观察值。
这里有一些要复制的虚拟数据。
x <- c("", "", "", "1", "", "","", "", "", "", "", "1","", "", "", "", "1", "")
y <- c("2", "6", "4", "4", "7", "9","1", "15", "7", "4", "5", "8","6", "1", "2", "4", "6", "16")
z <- c("a", "a", "a", "a", "a", "a","a", "b", "b", "b", "b", "b","b", "b", "c", "c", "c", "c")
a <- as.data.frame(cbind(x, y, z))
x y z
1 2 a
2 6 a
3 4 a
4 1 4 a
5 7 a
6 9 a
7 1 a
8 15 b
9 7 b
10 4 b
11 5 b
12 1 8 b
13 6 b
14 1 b
15 2 c
16 4 c
17 1 6 c
18 16 c
理想情况下,我希望a
看起来像这样:
x y z
1 6 a
2 4 a
3 1 4 a
4 7 a
5 9 a
6 1 a
7 4 b
8 5 b
9 1 8 b
10 6 b
11 1 b
12 2 c
13 4 c
14 1 6 c
15 16 c
a[zoo::rollapply(a$x, 5, function(z) "1" %in% z, partial = TRUE),]
# x y z
# 2 6 a
# 3 4 a
# 4 1 4 a
# 5 7 a
# 6 9 a
# 10 4 b
# 11 5 b
# 12 1 8 b
# 13 6 b
# 14 1 b
# 15 2 c
# 16 4 c
# 17 1 6 c
# 18 16 c
zoo::rollapply
操作"窗口"一次有几个数字。这里是5,这意味着它查看5个值并返回一个值;然后移动一个(四个相同的,再加一个),并返回一个值;等。
因为我指定了partial=TRUE
(当您需要输出长度与输入长度相同时是必要的),所以所查看的值的长度可能与k
内核宽度(5)不同。
关键是,如果我一次看五个,如果其中一个是"1"
,那么我们在"1
"的2行之内,应该保留。
窗口的一个重要属性是align
ment,它的默认值是center。它定义了结果在窗口中的位置。
在本例中,窗口看起来像:
# [1] "" "" "" "1" "" "" "" "" "" "" "" "1" "" "" "" "" "1" ""
1: nn-------' (partial match)
2: ----yy--------' (partial)
3: `-------yy-------' there is a window in this set of five, so a true ("yy")
4: `-------yy-------'
5: `-------yy-------'
6: `-------yy-------'
7: `-------nn-------' no "1", so a false
... etc
# [1] "" "" "" "1" "" "" "" "" "" "" "" "1" "" "" "" "" "1" ""
您可以在前七个窗口中看到第一个被丢弃(没有足够接近的"1"
),我们有五个为真(我的命名法中为"yy"
),然后我们得到一个假("nn")
,因为它没有看到"1"
。