使用data.table在R中有条件地替换每个组的第一个值

3
我有一个非常简单的问题。我的数据格式很长,如下所示:
ID    start.date    drug.start    drug.stop
1     01/02/2002    15/03/2004    16/04/2004
1     01/02/2002    16/04/2004    15/05/2004
...
2     05/01/2001    05/01/2001    06/02/2001
....

从上面的例子可以看出,ID为1的药品开始日期(drug.start)比他们总体开始日期(start.date)晚了两年以上,而ID为2的这两个日期相同。在数据中还有一些其他与ID 1相同的ID。
我想做的是将每个ID的第一个drug.start更改为start.date。
我的当前尝试是:
DT[, drug.start[1]:=start, by=ID]

我会得到以下错误:
Error in eval(expr, envir, enclos) : object 'drug.start' not found

我对 data.table 还很陌生,不太确定如何获得我想要的结果。
预先感谢您的帮助。

有一个功能请求发布了,针对你尝试的方式,请查看:https://github.com/Rdatatable/data.table/issues/571 - Frank
1个回答

4
我们可以使用行索引。我们获取每个“ID”的第一个值的行索引(假设它已经排序并且列是“字符”类),并使用此索引将“start.date”值分配给“drug.start”。
indx <- DT[, .I[1L], by=ID]$V1
DT[indx, drug.start := start.date]
DT
#   ID start.date drug.start  drug.stop
#1:  1 01/02/2002 01/02/2002 16/04/2004
#2:  1 01/02/2002 16/04/2004 15/05/2004
#3:  2 05/01/2001 05/01/2001 06/02/2001
#4:  2 05/02/2001 05/03/2001 06/05/2001

数据

df1 <-  structure(list(ID = c(1L, 1L, 2L, 2L), 
start.date = c("01/02/2002", 
"01/02/2002", "05/01/2001", "05/02/2001"), drug.start = c("15/03/2004", 
"16/04/2004", "05/01/2001", "05/03/2001"), drug.stop = c("16/04/2004", 
"15/05/2004", "06/02/2001", "06/05/2001")), .Names = c("ID", 
"start.date", "drug.start", "drug.stop"), class = "data.frame", 
row.names = c(NA, -4L))

DT <- as.data.table(df1) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接