使用Data.Table R中的行方式操作创建新列

时间:2014-06-18 17:17:30

标签: r data.table

我在R中有两个data.tables如下:

DT_Asiddatevalue1value2,其中sid是主键,date是次要的关键。

DT_B包含siddate1date2date3,......,date12列。此处sid是主键,因此每行对应唯一sid,其他列名对应DT_A中的辅助键。

我想向DT_A添加另一列,其中第i行包含表DT_B [sid_i,date_i]中的对应元素

以下是示例代码和所需的输出:

require(data.table)
DT_A <- data.table(sid = c(1,2,3,4,5,1,3), 
                   date = c("Jan 2012", "Feb 2012", "April 2012", "May 2012", 
                            "Dec 2012", "Feb   2012", "Oct 2012"),
                   value1 = rep("1", 7), 
                   value2 = rep("1", 7))

DT_B <- data.table(sid = as.character(c(1,2,3,4,5)), 
                   "Jan 2012" = rep("1", 5),
                   "Feb 2012" = rep("2", 5),
                   "March 2012" = rep("3", 5),
                   "April 2012" = rep("4", 5),
                   "May 2012" = rep("5", 5),
                   "June 2012" = rep("6", 5),
                   "July 2012" = rep("7", 5),
                   "Aug          2012" = rep("8", 5),
                   "Sept 2012" = rep("9", 5),
                   "Oct 2012" = rep("10", 5),
                   "Nov 2012" = rep("11", 5),
                   "Dec 2012" = rep("12", 5))

#Set Keys
setkey(DT_A, sid, date)
setkey(DT_B, sid)

#Define Function fun1
fun1 <- function(x){ 
    tryCatch(DT_B[x[1], x[2], with=FALSE], error = function(e) NULL)
}

#Desired Output
DT_A$newCol <- sapply(apply(DT_A, 1, fun1),"[[",1)
DT_A

虽然我当前的方法适用于这个小例子,但我的实际DT_A有2000万行。这种方法完全挂在那里。我们可以使用data.table或任何其他方法以更有效的方式执行此操作吗?

1 个答案:

答案 0 :(得分:3)

融化你的第二个data.table

library(reshape2)

DT_B.melted = melt(DT_B, id.vars = 'sid', variable.name = 'date')

一旦融化,您可以将两者都设置为相同的键,并进行加入/分配/等等:

setkey(DT_B.melted, sid, date)
setkey(DT_A, sid, date)

DT_A[DT_B.melted, newCol := value]