我想要满足特定条件的数据集特定行的子集,这是我想要运行的标准
for (i in 1:(nrow(DT)-1)){
if(DT$IBTKR2[i]==DT$IBTKR2[i+1]&
DT$AMASKCD[i]==DT$AMASKCD[i+1]&
DT$IRECCD[i]!=3&DT$IRECCD[i+1]==3){
form a subset that includes rows DT[i+1]}}
基本上它意味着如果行的IBTKR2和它下面的行相等,看看AMASKCD,如果行和它下面的行等于3,看看IRECCD,如果行的IRECCD不等于到3,它下面的行等于3,我想把这一行和一个子集。
下面的是我的数据集
的示例 Row IBTKR2 AMASKCD IRECCD ANNDATS
1 @0CC 71476 1 20000704
2 @0CC 71476 1 20001204
3 @0CF 19813 3 20000831
4 @0CF 47104 3 20000420
5 @0CF 47340 3 20000418
6 @0CF 48938 3 20000821
7 @0CF 56117 2 20000330
8 @0CF 56117 3 20000413
9 @0CF 56117 2 20000526
10 @0CF 56117 3 20000713
11 @0CF 56117 2 20000801
12 @0CF 56117 3 20000804
13 @0CF 58875 3 20000609
14 @0CF 58875 1 20000822
15 @0CF 74030 3 20001027
我应该得到
的子集 Row IBTKR2 AMASKCD IRECCD ANNDATS
8 @0CF 56117 3 20000413
10 @0CF 56117 3 20000713
12 @0CF 56117 3 20000804
答案 0 :(得分:2)
我们可以使用shift
使用type
参数获取下一行/上一行,将逻辑向量转换为行索引(.I
)并提取行。
library(data.table)
setDT(DT) #in case the dataset is not a `data.table`
DT[DT[, .I[IBTKR2==shift(IBTKR2, type = "lead", fill= IBTKR2[1]) &
AMASKCD == shift(AMASKCD, type = "lead", fill = AMASKCD[1]) &
(IRECCD !=3) & shift(IRECCD, type = "lead", fill= IRECCD[1])==3]]+1]
# Row IBTKR2 AMASKCD IRECCD ANNDATS
#1: 8 @0CF 56117 3 20000413
#2: 10 @0CF 56117 3 20000713
#3: 12 @0CF 56117 3 20000804