使用特定条件获取data.table中的特定行

时间:2016-09-13 16:02:45

标签: r subset

我想要满足特定条件的数据集特定行的子集,这是我想要运行的标准

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

1 个答案:

答案 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