更新data.table列更改数据类型

时间:2014-10-22 22:45:39

标签: r join data.table subset

我正在测试一个小规模的场景,然后在更大的生产环境中推出它,并且遇到了一个奇怪的事情。

我有2个数据集:

dtL <- data.table(URN=c(1,2,3,4,5), DonorType=c("Cash","RG","Emergency","Emergency","Cash"))
dtL[,c("EmergVal","EmergDate") := list(as.numeric(NA),as.Date(NA))]
setkey(dtL,URN)

dtR <- data.table(URN = c(1,1,1,2,3,3 ,3 ,4,4, 4,4,5),
                  class=c(5,5,5,1,5,40,40,5,40,5,40,5),
                  xx=   c(25,50,25,10,100,20,25,20,40,35,20,25),
                  xdate=as.Date(c("2013-01-01","2013-06-05","2014-05-27","2014-10-14",
                          "2014-06-09","2014-04-07","2014-10-16",
                          "2014-07-16","2014-10-21","2014-10-22","2014-09-18","2013-12-19")))
setkey(dtR,URN)

我希望更新dtL等于“紧急”的DonorType,但仅限于dtR的一部分记录。我见过Update subset of data.table based on join,因此将其作为我解决方案的基础。

dtL[dtR[class==40,list(maxxx=max(xx)),by=URN],
    EmergVal := ifelse(DonorType=="Emergency",i.maxxx,as.numeric(NA))]
dtL[dtR[class==40,list(maxdate=max(xdate)),by=URN],
    EmergDate := ifelse(DonorType=="Emergency",as.Date(i.maxdate),as.Date(NA)),nomatch=0]

我没有收到任何错误,但是当我查看dtL中的数据时,它已将EmergDate的数据类型更改为num而不是最初的数据类型(即Date)。

所以有三个问题

  1. 为什么它改变了数据类型(特别是当它是在dtL中首次创建的日期时,我告诉它把它作为我的ifelse语句中的日期?
  2. 如何在分配日期时保留日期类型?或者我必须做一些职位转换/铸造吗?
  3. 我是否有一种干净的方式可以在单个语句中完成我的EmergVal和EmergDate的分配,因为我在dtR中没有字段DonorType而我不想添加它(所以不能使用连接的多个键)?

0 个答案:

没有答案