R 在&;之前添加行中包含数据的列;在某种情况下

R 在&;之前添加行中包含数据的列;在某种情况下,r,indexing,data.table,R,Indexing,Data.table,受来自的启发,我想出了一个解决方案,在y==5前后添加一个列,其中1的2行位于其中。像这样: library(data.table) DT <- fread("grp y exclude a 1 0 a 2 0 a 3 0 a 4 1 a 5 0 a 7 1 a 8 0 a 9 0

受来自的启发,我想出了一个解决方案,在y==5前后添加一个列,其中1的2行位于其中。像这样:

library(data.table)
DT <- fread("grp y exclude
            a 1 0
            a 2 0
            a 3 0
            a 4 1
            a 5 0
            a 7 1
            a 8 0
            a 9 0
            a 10 0
            b 1 0
            b 2 0
            b 3 0
            b 4 1
            b 5 0
            b 6 1
            b 7 1
            b 8 0
            b 9 0
            b 10 0
            c 5 1
            d 1 0")

DT[DT[, rn := .I][, rn[abs(.I - .I[y==5]) <= 2], by=grp]$V1, xx:=1]

下面是另一种使用
shift

val <- 5L
DT[, xx := as.integer(
        Reduce(`|`, c(shift(y==val, 0L:2L, fill=FALSE), shift(y==val, 1L:2L, FALSE, "lead")))
    ),
    by=.(grp)]
DT
输出:

    grp  y exclude xx
 1:   a  1       0  1
 2:   a  5       0  1
 3:   a  3       0  1
 4:   a  4       1  1
 5:   a  5       0  1
 6:   a  7       1  1
 7:   a  8       0  1
 8:   a  9       0  0
 9:   a 10       0  0
10:   b  1       0  0
11:   b  2       0  0
12:   b  3       0  1
13:   b  4       1  1
14:   b  5       0  1
15:   b  6       1  1
16:   b  7       1  1
17:   b  8       0  0
18:   b  9       0  0
19:   b 10       0  0
20:   c  5       1  1
21:   d  1       0  0
    grp  y exclude xx

下面是另一种使用
shift

val <- 5L
DT[, xx := as.integer(
        Reduce(`|`, c(shift(y==val, 0L:2L, fill=FALSE), shift(y==val, 1L:2L, FALSE, "lead")))
    ),
    by=.(grp)]
DT
输出:

    grp  y exclude xx
 1:   a  1       0  1
 2:   a  5       0  1
 3:   a  3       0  1
 4:   a  4       1  1
 5:   a  5       0  1
 6:   a  7       1  1
 7:   a  8       0  1
 8:   a  9       0  0
 9:   a 10       0  0
10:   b  1       0  0
11:   b  2       0  0
12:   b  3       0  1
13:   b  4       1  1
14:   b  5       0  1
15:   b  6       1  1
16:   b  7       1  1
17:   b  8       0  0
18:   b  9       0  0
19:   b 10       0  0
20:   c  5       1  1
21:   d  1       0  0
    grp  y exclude xx

你说在y==1之前和之后添加一个包含1的2行的列……你是说当exclude==1时吗?哦,你是说当y==5时。。。?请澄清你不能在索引似乎被截断到相关行范围的情况下使用(的相关部分)吗:(
x[x>0&xy你说在y==1之前和之后添加一个包含1的2行的列……你的意思是什么时候排除==1?哦,那么你的意思是什么时候
y==5
…?请澄清你不能使用(的相关部分)在这里,索引似乎被截断到了相关的行范围:(
x[x>0&x)对于最新版本的,您可以将其简化为:
DT[,xx:=+(Reduce(`|```,shift(y==v,n=-2:2,fill=FALSE)),by=grp][
@Jaap-这看起来不错,但我得到了错误:+(Reduce(
),shift)(y==v,n=-2:2,fill=FALSE)):一元数的参数无效operator@JeppeOlsen您是否使用
v@Jaap Yes和no定义了
v
。在将v设置为5后,我得到了移位错误(y==v,n=-2:2,fill=FALSE):n必须是非负整数值(>=0)将n设置为某个整数值会得到与Jaap提到的相同的错误,您需要最新版本的data.table(即1.12.0)。请参阅,使用最新版本的,您可以将其简化为:
DT[,xx:=+(Reduce(`124; `,shift(y==v,n=-2:2,fill=FALSE)),by=grp[
@Jaap-看起来不错,但我得到的错误是:+(Reduce)(
|
,shift(y==v,n=-2:2,fill=FALSE)):一元变量的参数无效operator@JeppeOlsen您是否使用
v@Jaap Yes和no定义了
v
。在将v设置为5后,我得到了移位错误(y==v,n=-2:2,fill=FALSE):n必须是非负整数值(>=0)将n设置为某个整数值会得到与Jaap提到的相同的错误,您需要最新版本的data.table(即1.12.0)。请参阅和
    grp  y exclude xx
 1:   a  1       0  1
 2:   a  5       0  1
 3:   a  3       0  1
 4:   a  4       1  1
 5:   a  5       0  1
 6:   a  7       1  1
 7:   a  8       0  1
 8:   a  9       0  0
 9:   a 10       0  0
10:   b  1       0  0
11:   b  2       0  0
12:   b  3       0  1
13:   b  4       1  1
14:   b  5       0  1
15:   b  6       1  1
16:   b  7       1  1
17:   b  8       0  0
18:   b  9       0  0
19:   b 10       0  0
20:   c  5       1  1
21:   d  1       0  0
    grp  y exclude xx