首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下标界错误数据表

下标界错误数据表
EN

Stack Overflow用户
提问于 2015-12-06 15:17:00
回答 1查看 850关注 0票数 1

我有一个简单的数据框架如下:

代码语言:javascript
复制
 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,而不是2011年拥有A10A代码的人。在上面的dataframe中,有一些人在任何阶段都没有代码A10A,所以我也想摆脱它们。最后,我只想得到帕特和玛丽的数据。我就是这样做的:

步骤1:指定“索引日期”。换句话说,2012年的第一次约会,有人得到了代码A10A

代码语言:javascript
复制
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:创建索引日期为不是A10A或在2012-01年之前发生的行创建一些NA值。我需要用每个人的唯一索引日期来填写这个NA值。这段代码通常正常工作,但出于对这些数据的原因,我一直收到一个错误。

代码语言:javascript
复制
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?,并尝试运行他们推荐的测试:但我似乎没有额外的变量索引行。也许我没有好好测试。

如果有人能弄清楚为什么会发生上述情况,我将非常感激。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-06 15:47:45

通过使用any函数,您可以更容易地实现您想要的结果。使用any(hai_atc=="A10A"),您可以为所有拥有A10A的人创建一个逻辑向量,而使用!any(hai_atc=="A10A" & year(date_of_claim) == 2011),您可以为那些在2011年拥有该代码的人将该向量更新为FALSE。使用[idx==TRUE],只需过滤所需的情况,而使用[,idx:=NULL],则可以删除idx列:

代码语言:javascript
复制
newDT <- DT[, idx := any(hai_atc=="A10A") & !any(hai_atc=="A10A" & year(date_of_claim) == 2011),
            by = hai_dispense_number
            ][idx==TRUE][,idx:=NULL]

这导致:

代码语言:javascript
复制
> 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]。此外,您的代码可以简化为:

代码语言:javascript
复制
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]

但是,这并没有给出您所描述的结果:

代码语言:javascript
复制
> 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函数,您可以以一种更简单的方式实现所需的结果。这也适用于更复杂的数据集。在grepl中使用any也不是问题

代码语言:javascript
复制
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]

得出了同样的结果:

代码语言:javascript
复制
> identical(newDT, newDT2)
[1] TRUE
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34118982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档