我有一份大型患者数据数据表。我想删除“id”重复的行,而不会丢失“date”列中的信息。
id date
01 2004-07-01
02 NA
03 2013-11-15
03 2005-03-15
04 NA
05 2011-07-01
05 2012-07-01
我可以通过以下两种方式之一做到这一点 -
创建一个写入日期列值的列,以连接该ID的所有日期,即:
id date_new
01 2004-07-01
02 NA
03 2013-11-15; 2005-03-15
04 NA
05 2011-07-01; 2012-07-01
或
为每个附加日期创建一个新列,即:
id date_new date_new2
01 2004-07-01 NA
02 NA NA
03 2013-11-15 2005-03-15
04 NA NA
05 2011-07-01 2012-07-01
我尝试了一些事情,但他们一直在崩溃我的R会话(我收到消息R Session Aborted. R encountered a fatal error. The session was terminated.
):
setkey(DT, "id")
unique_DT <- subset(unique(DT))
和
DT[!duplicated(DT[, "id", with = FALSE])]
然而,除了崩溃R之外,这些解决方案都不能满足我对日期的要求。
有什么想法吗?我是数据表的新手(通常是R)但我有一种模糊的感觉,我可以用:=
以某种方式解决这个问题。
答案 0 :(得分:2)
试试这个:
dt[,c(date_new=paste(date,collapse="; "),.SD),by=id]
答案 1 :(得分:0)
你可以使用聚合函数,它应该做你想要的。我在将日期切换到因子时遇到了一些麻烦,但似乎用I()将日期字符串括在一起作为一个字符。
id=c(1,2,3,3,4,5,5)
date = c("2004-07-01","NA","2013-11-15","2005-03-15","NA",
"2011-07-01","2012-07-01")
data=as.data.frame(list(id=id,date=date))
data$date=as.character(data$date)
aggregate(list(date = I(data$date)),by=list(id = data$id),c)
id date
1 1 2004-07-01
2 2 NA
3 3 2013-11-15, 2005-03-15
4 4 NA
5 5 2011-07-01, 2012-07-01
编辑:使用聚合函数但使用了paste而不是c。将折叠选项更改为“;”应解决分隔符问题
newdata = aggregate(list(date = I(data$date)),
by=list(id = data$id),
function(x){paste(unique(x),collapse=";")})
newdata
id date
1 1 2004-07-01
2 2 NA
3 3 2013-11-15;2005-03-15
4 4 NA
5 5 2011-07-01;2012-07-01