选择每个R的第一个日期

时间:2013-12-10 19:29:04

标签: r data.table col subject

这个问题与这篇文章give each id the same column value R有关,但那里的解决方案对我不起作用。

我有一个数据表,其中索引是个人获得药物C10的第一个日期。*?在2010-04-01和2010-09-30之间:

names   drugs      dates      index
1:  mary C10AA07 2009-10-01         NA
2:  mary C09AA03 2010-06-01         NA
3:  mary C10AA07 2010-07-01 2010-07-01
4:  mary A02BC01 2010-07-01         NA
5:  mary C10AA07 2010-07-24 2010-07-01
6:   tom C10AA05 2009-12-01         NA
7:   tom C10AA05 2010-04-06 2010-04-06
8:   tom C07AB03 2010-05-12         NA
9:   tom C10AA05 2010-08-01 2010-04-06

我试图给mary指定“index”列中所有行的索引日期。汤姆也是如此。所以输出就像这样:

 names   drugs      dates      index
1:  mary C10AA07 2009-10-01 2010-07-01
2:  mary C09AA03 2010-06-01 2010-07-01
3:  mary C10AA07 2010-07-01 2010-07-01
4:  mary A02BC01 2010-07-01 2010-07-01
5:  mary C10AA07 2010-07-24 2010-07-01
6:   tom C10AA05 2009-12-01 2010-04-06
7:   tom C10AA05 2010-04-06 2010-04-06
8:   tom C07AB03 2010-05-12 2010-04-06
9:   tom C10AA05 2010-08-01 2010-04-06

这正是上面发布的链接中的问题。这些是我尝试过的代码行,但是每个代码都给我打包索引的所有NA值,否则不会改变我的dt2

尝试1:

dt2[, index := index[grepl('^C10.*?', as.character(dt2$drugs))& dt2$dates>="2010-04-01" & dt2$dates<"2010-10-01"][1], by = names]     
dt2

尝试2:

dt2[, index := index[grepl('^C10.*?', as.character(dt2$drugs))[1], by = names])
dt2

我无法理解发生了什么以及为什么代码不起作用。如果有人能够阐明这一点,那就太棒了。谢谢。

尝试3:

dt2[, index := index[drugs == 'C10AA05' & drugs=='C10AA07'][1], by = names]
dt2

1 个答案:

答案 0 :(得分:3)

根据您的描述,如果您的索引尚未填写,请使用:

dt2[, index := min(dates[grepl("^C10", drugs)], na.rm=TRUE), by=names]

如果您的索引已经具有正确的值,并且您只是想填充NA,请使用以下代码,因为它会更快

> dt2[, index := index[!is.na(index)][[1]], by=names]
> dt2
   names   drugs      dates      index
1:  mary C10AA07 2009-10-01 2010-07-01
2:  mary C09AA03 2010-06-01 2010-07-01
3:  mary C10AA07 2010-07-01 2010-07-01
4:  mary A02BC01 2010-07-01 2010-07-01
5:  mary C10AA07 2010-07-24 2010-07-01
6:   tom C10AA05 2009-12-01 2010-04-06
7:   tom C10AA05 2010-04-06 2010-04-06
8:   tom C07AB03 2010-05-12 2010-04-06
9:   tom C10AA05 2010-08-01 2010-04-06
> 

如果您经常这样做,我建议您将密钥设置为drugs,或者甚至创建一个包含该药物的新列。请注意,您可以使用.SD中的密钥,因此以下内容对您有用:

dt2[, drugid := substr(drugs, 1, 3)]
setkey(dt2, drugid)

## HAVE A LOOK AT THE OUTPUT
dt2[, .SD[.("C10"), min(dates)]]
dt2[, .SD[.("C10"), min(dates)], by=names]
dt2[, .SD[.("C10"), min(dates)]$V1, by=names]
dt2[, index := .SD[.("C10"), min(dates)]$V1, by=names]