2

这个问题与这篇文章有关,给每个 id 相同的列值 R但那里的解决方案对我不起作用。

我有一个数据表,其中索引是个人获得药物 C10.* 的第一个日期?在 2010 年 4 月 1 日至 2010 年 9 月 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

我正在尝试为玛丽提供“索引”列中所有行的索引日期。汤姆也是如此。所以输出是这样的:

 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
4

1 回答 1

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
> 

如果您要经常这样做,我建议您设置 keydrugs或什至使用 drugid 创建一个新列。请注意,您可以使用密钥 in .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]
于 2013-12-10T19:57:25.017 回答