假设我有一个df:
df <- data.frame(flag = c(rep(0, 20)),
include = c(rep(1, 20)))
df[c(4,8,16), ]$flag <- 1
df
flag include
1 0 1
2 0 1
3 0 1
4 1 1
5 0 1
6 0 1
7 0 1
8 1 1
9 0 1
10 0 1
11 0 1
12 0 1
13 0 1
14 0 1
15 0 1
16 1 1
17 0 1
18 0 1
19 0 1
20 0 1
我想要做的是,如果该行在flag == 1
所在行的+/-两行内,则将include
标志更改为0。
flag include
1 0 1
2 0 0
3 0 0
4 1 1
5 0 0
6 0 0
7 0 0
8 1 1
9 0 0
10 0 0
11 0 1
12 0 1
13 0 1
14 0 0
15 0 0
16 1 1
17 0 0
18 0 0
19 0 1
20 0 1
我想到了一些“创新”(读作:效率低下和过于复杂)的方法,但我认为一定有一个简单的方法,我忽略了。
如果答案是这样的,我可以将其推广到+/-n
行,那就太好了,因为我有更多的数据,可能会在+/- 10行内搜索...
5条答案
按热度按时间wz8daaqr1#
data.table
的另一个选项:放入一个函数:
xzlaal3s2#
肯定还有其他更简单的方法,但我能想到的第一种方法是使用
sapply
和which
我们首先找出
flag
为1的所有索引,然后围绕每个索引创建所需的数字序列,并将include
的索引设置为0。对于变量
n
,我们可以svujldwt3#
对于
n
行,ha5z0ras4#
另一种方法是使用
zoo::rollapply
,为了确定一行是否在flag == 1
所在行的+/-两行之内,我们检查窗口中的最大flag
是否为1。我们需要
rollapply
而不是rollmax
,因为我们需要指定partial = T
。jogvjijk5#
使用
which
和outer
。如果在一个或两个位置内flag=1,则恢复在位置0被覆盖的数据。注意,如果“flag”在特定范围内重叠,则此步骤至关重要。
如果在数据集开头或结尾的一行或两行中flag = 1,R将抛出错误。
恢复1和以前一样