R 在&;之前添加行中包含数据的列;在某种情况下
受来自的启发,我想出了一个解决方案,在y==5前后添加一个列,其中1的2行位于其中。像这样: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
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