2014-06-18 38 views
1

我中的R 2個data.tables如下新的列:創建Data.Table使用行操作ř

DT_A與列siddatevalue1value2,其中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或其他任何方法以更高效的方式進行此操作嗎?

+0

您沒有提供' DT_A' –

+0

對不起,現在已經做了 – user3750170

+0

我覺得應該重新編寫這個問題。這不是關於做明智的行動,這是關於重塑和合並。 – geneorama

回答

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] 
+0

我想你需要在熔化後添加'DT_B.melted [,sid:= as.numeric(sid)]',否則它會返回錯誤(對我來說至少) –

+0

@DavidArenburg你是對的 - 但我認爲類錯配只是OP中的一個錯誤(也就是說,在融化開始之前,它應該是固定的上游) – eddi

+0

哇...這就像一陣微風,我不知道熔化函數......非常感謝... – user3750170