在R data.table中按ID删除重复的行,但添加一个包含来自另一列的连接日期的新列

时间:2015-11-02 19:02:51

标签: r data.table

我有一份大型患者数据数据表。我想删除“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

我可以通过以下两种方式之一做到这一点 -

  1. 创建一个写入日期列值的列,以连接该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
    
    1. 为每个附加日期创建一个新列,即:

      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
      
    2. 我尝试了一些事情,但他们一直在崩溃我的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)但我有一种模糊的感觉,我可以用:=以某种方式解决这个问题。

2 个答案:

答案 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