我有一个非常简单的问题。我有长数据,格式如下:
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
的{{1}}在整体drug.start
之后超过2年,而ID start.date
则两个日期相同。数据中还有一些其他ID与ID 2
相同。
我想要做的是将每个ID的第一个1
更改为drug.start
。
我目前的尝试是:
start.date
我收到以下错误:
DT[, drug.start[1]:=start, by=ID]
我对Error in eval(expr, envir, enclos) : object 'drug.start' not found
很陌生,不太清楚如何得到我想要的东西
感谢您的帮助。
答案 0 :(得分:4)
我们可以使用行索引。我们得到每个' ID'的第一个值的行索引(.I
)。 (假设它已经被排序并且列是'字符'类),并使用此索引来分配' 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)