2015-12-06 54 views
1

我有一个简单的数据帧如下:下标越界错误数据表

hai_dispense_number hai_atc date_of_claim hai_age 
1     tom A10A 2011-11-01  42 
2     tom A10B 2011-11-01  42 
3     tom G10R 2011-11-01  42 
4     tom A10A 2012-02-02  42 
5     tom A10A 2012-04-03  42 
6     mary A10A 2012-02-02  36 
7     mary A10A 2012-03-02  36 
8     mary G123 2012-03-02  36 
9     mary E123 2012-05-02  36 
10    mary T123 2012-07-02  36 
11    mary A10A 2012-08-02  43 
12     sue GR123 2012-03-02  43 
13     sue GR123 2012-03-08  43 
14     sue GR123 2012-09-03  43 
15     sue GR123 2012-10-01  43 
16     sue GR123 2012-03-02  43 
17     pat A10A 2012-01-02  52 
18     pat GR123 2011-11-12  52 
19     pat A10A 2012-03-03  52 
20     pat GR123 2012-01-01  52 
21     pat A10A 2012-05-06  52 

我想孤立的人谁只能从2012-01-01开始了代码A10A,而不是在2011年有是上述数据框架中的一些人在任何阶段都没有代码A10A,所以我想摆脱它们。所以最后,我想只有拍拍和玛丽的数据。这里是我如何做到这一点:

第1步:分配“索引日期”。换句话说,2012年,有人拿到了代码A10A

dt2<- data.table(dff,key=c('hai_dispense_number','date_of_claim')) 
dt2[,date_of_claim := as.Date(date_of_claim)] 
dt2[grepl('^A10A*?', as.character(dt2$hai_atc))& between(date_of_claim,as.Date("2012-01-01"),as.Date("2012-12-31")), 
    index := as.character(min(date_of_claim)) 
    , by=c('hai_dispense_number','hai_atc')] # 
dt2$index<-as.Date(dt2$index, origin='1970-01-01') 
dt2$hai_atc<-as.character(dt2$hai_atc) 

步骤2中的第一次约会:创建索引日期产生了一些NA对于未A10A或2012-01发生前行中的值。我需要用每个人的唯一索引日期来填写这个NA值。此代码通常工作,但原因与这些数据,我不断收到一个错误

dt2[, index := index[!is.na(index)][[1]], by=hai_dispense_number] ##gives the index date for each person to each of their individual rows of data 

Error in index[!is.na(index)][[1]] : subscript out of bounds 

步骤3,4和5:我通常可以从这里遵循,并找出谁在2011年有一个代码A10A和然后排除它们。但是我的过程被上述错误中断。

我看着这个页面:Subscript out of bounds - general definition and solution?并尝试运行他们推荐的测试:但它看起来不像我有变量索引额外的行。也许我没有正确测试。

如果任何人都可以解释为什么上述情况发生,我会非常感激。谢谢!

回答

3

通过使用any函数,您可以更轻松地实现所需功能。使用any(hai_atc=="A10A"),您为A10A!any(hai_atc=="A10A" & year(date_of_claim) == 2011)的所有人创建了一个逻辑向量,您将在2011年更新那个拥有该代码的人的出价,即FALSE。随着[idx==TRUE]你过滤你需要的情况下并[,idx:=NULL]您删除idx柱:

newDT <- DT[, idx := any(hai_atc=="A10A") & !any(hai_atc=="A10A" & year(date_of_claim) == 2011), 
      by = hai_dispense_number 
      ][idx==TRUE][,idx:=NULL] 

这导致:

> newDT 
    hai_dispense_number hai_atc date_of_claim hai_age 
1:    mary A10A 2012-02-02  36 
2:    mary A10A 2012-03-02  36 
3:    mary G123 2012-03-02  36 
4:    mary E123 2012-05-02  36 
5:    mary T123 2012-07-02  36 
6:    mary A10A 2012-08-02  43 
7:     pat A10A 2012-01-02  52 
8:     pat GR123 2011-11-12  52 
9:     pat A10A 2012-03-03  52 
10:     pat GR123 2012-01-01  52 
11:     pat A10A 2012-05-06  52 

在回答您的评论:您可能需要使用单方括号(即:[ ]),如dt2[, index := index[!is.na(index)][1], by=hai_dispense_number]。此外,你的代码可以简化为:

dt2 <- data.table(mydf,key=c('hai_dispense_number','date_of_claim')) 
dt2[, date_of_claim := as.Date(date_of_claim)] 
dt2[grepl('^A10A*?', hai_atc) & between(date_of_claim, as.Date("2012-01-01"), as.Date("2012-12-31")), 
    index := min(date_of_claim), by=.(hai_dispense_number,hai_atc)] 

dt2[, index := index[!is.na(index)][1], by=hai_dispense_number] 

然而,这给并不像你所描述的结果:

> dt2 
    hai_dispense_number hai_atc date_of_claim hai_age  index 
1:    mary A10A 2012-02-02  36 2012-02-02 
2:    mary A10A 2012-03-02  36 2012-02-02 
3:    mary G123 2012-03-02  36 2012-02-02 
4:    mary E123 2012-05-02  36 2012-02-02 
5:    mary T123 2012-07-02  36 2012-02-02 
6:    mary A10A 2012-08-02  43 2012-02-02 
7:     pat GR123 2011-11-12  52 2012-01-02 
8:     pat GR123 2012-01-01  52 2012-01-02 
9:     pat A10A 2012-01-02  52 2012-01-02 
10:     pat A10A 2012-03-03  52 2012-01-02 
11:     pat A10A 2012-05-06  52 2012-01-02 
12:     sue GR123 2012-03-02  43  <NA> 
13:     sue GR123 2012-03-02  43  <NA> 
14:     sue GR123 2012-03-08  43  <NA> 
15:     sue GR123 2012-09-03  43  <NA> 
16:     sue GR123 2012-10-01  43  <NA> 
17:     tom A10A 2011-11-01  42 2012-02-02 
18:     tom A10B 2011-11-01  42 2012-02-02 
19:     tom G10R 2011-11-01  42 2012-02-02 
20:     tom A10A 2012-02-02  42 2012-02-02 
21:     tom A10A 2012-04-03  42 2012-02-02 

为什么你没有得到你的代码预期结果的原因是你并不排除2011年有A10A的组。any功能专门用于实现您所描述的逻辑操作。

此外,通过使用any函数,您可以以更简单的方式实现所需的结果。这也适用于更复杂的数据集。这也是不使用greplany一个问题:

newDT2 <- DT[, idx := any(grepl('^A10A*?', hai_atc)) & !any(grepl('^A10A*?', hai_atc) & year(date_of_claim) == 2011), 
      by = hai_dispense_number 
      ][idx==TRUE][,idx:=NULL] 

可以得到相同的结果:

> identical(newDT, newDT2) 
[1] TRUE 
+0

嗨贾普,感谢您的回答和“任何”的建议。我想坚持使用我的代码,因为实际的数据集实际上更复杂一些,代码比A10A长得多。因此,想要继续使用“grepl”,除了更复杂的日期问题外,不仅仅是排除2011年的日期。我在这里提出了一个简单的数据集版本,试图获得有关错误的帮助。你知道为什么我用来重复每个人的唯一索引日期的代码在这里不起作用吗?我以前用过它没有问题,但我无法弄清楚这里发生了什么。 – user2363642

+0

@ user2363642查看更新,HTH – Jaap

+0

单支架工作。这样一个简单的解决方案 - 谢谢。我会玩弄“任何”和我的日期,看看我能不能做到我想要的。你是对的 - 你的代码要简单得多。再次感谢你!为什么双括号不起作用? – user2363642