R -标识标志前后的-n行*by group*



我有一个艰难的时间隔离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行之内,应该保留。

窗口的一个重要属性是alignment,它的默认值是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"

最新更新