为每个单独的R选择第一个日期

为每个单独的R选择第一个日期,r,data.table,col,subject,R,Data.table,Col,Subject,这个问题与这篇文章有关,但那里的解决方案对我不起作用 我有一个数据表,其中索引是个人获得药物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 A02BC0

这个问题与这篇文章有关,但那里的解决方案对我不起作用

我有一个数据表,其中索引是个人获得药物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
我试图为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
我不明白发生了什么,为什么代码不能工作。如果有人能解释这一点,那就太好了。多谢各位

尝试3:

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

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

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
> 

如果您经常这样做,我建议您将key设置为
druges
,甚至使用drugid创建一个新列。请注意,您可以使用
.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]

试试
dt2[,sapply(.SD,class)]
,你得到了什么?日期和索引都设置为日期。名称药物日期索引“factor”“factor”“Date”“Date”是有效的。非常感谢你。你知道我上面试过的代码为什么不起作用吗?我的第一个倾向是说它与NA值有关,但在示例中,我给出了有NA值的链接,代码运行良好。只是试着学习和理解:)@user2363642,看起来你在使用
和(&)
而你本应该使用
或(|)的时候。简单的mistake@user2363642,作为一个常见的故障排除技巧,当您没有得到预期的结果时,将其分解,看看每个部分是否都提供了您预期的结果。例如,在
attempt3
中,我将其简化为
dt2[,druges=='C10AA05'和druges=='C10AA07',by=names]
,然后查看该输出,感谢您提供教学要点。非常感谢。我试图修改代码以适应|而不是&,但没有任何区别。此外,我的一些代码没有使用&符号。。。。。令人费解。至于分解代码-谢谢,好提示!我想你只是被布尔逻辑搞混了。并非所有的
&
都需要更改,只是其中一些需要更改。例如,类似于
grep(..)和(date==A | date==B)
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]