2013-05-02 57 views
1

我有A R data.table看起來像下面表現在上data.table具有兩列賦予功能作爲因子

User_ID Exec_No Job_No 
1: 2  1  1 
2: 2  2  2 
3: 3  2  3 
4: 1  2  4 
5: 1  1  5 
6: 3  2  6 
7: 2  2  7 
8: 1  1  8 

,對於(USER_ID,Exec_No)的不同組合,我需要的向量所有Job_No屬於該類別。

list (
    list(User_ID = 2, Exec_No = 1, Job_Nos = c(1)) , 
    list(User_ID = 2, Exec_No = 2, Job_Nos = c(2,7)) , 
    list(User_ID =3, Exec_No = 2, Job_Nos = c(3,6)) , 
    list(User_ID =1, Exec_No = 2, Job_Nos = c(4)) , 
    list(User_ID =1, Exec_No = 1, Job_Nos = c(5,8)) 
) 

我希望操作的輸出是列表的列表。

考慮到輸入data.table將有大約50萬行,我該如何在R中快速實現這一目標?

+0

嗨,它不是很清楚你的開始輸入是什麼,你想要的輸出是什麼。請你澄清一下 – 2013-05-02 14:50:27

+0

@RicardoSaporta我編輯了我的問題。 – 2013-05-02 15:03:35

回答

4

在這裏你去:

dt = data.table(user.id = c(2,2,3,1,1,3,2,1), exec.no = c(1,2,2,2,1,2,2,1), job.no = c(1:8)) 

dt[, list(result = list(list(user.id = user.id, 
          exec.no = exec.no, 
          job.nos = job.no))), 
    by = list(user.id, exec.no)][, result] 
+0

+1 - 很好。我仍然覺得很難讓我的頭部圍繞DT語法。請你能告訴我如何做到這一點,以獲得我使用ddply的結果?即'data.table',其中結果行是作業號碼列表?我只是*不能*弄清楚。 – 2013-05-02 15:26:16

+0

明白了! dt(,list(result = list(job.nos = job.no)),by = list(user.id,exec.no)]'謝謝 - 我(主要)看看你現在做了什麼。 – 2013-05-02 15:29:10

+0

是的,哇,這是很多嵌套列表。儘管OP請求了一個列表列表,但我認爲'dt [,list(list_o_jobnos = list(unique(job.no)))by =「user.id,exec.no」]的輸出看起來更清晰。 – Frank 2013-05-02 15:53:54

1

我想你在找什麼是這樣的事情,但是又很難從這個問題告訴:

setkey(DT, "User_ID", "Exec_No") 

getJobNo <- function(U, E) 
    DT[.(U, E)][, unlist(Job_No)] 


getJobNo(3, 2) 
3

您冷加工使用plyr對於這一點,但我認爲這將是一個有點慢滿足您的需求。要返回您原本粘貼就可以使用ddply什麼...

ddply(DT , .(User_ID,Exec_No) , summarise , "Job_Nos" = list(Job_No) ) 
# User_ID Exec_No Job_Nos 
#1  1  1 5, 8 
#2  1  2  4 
#3  2  1  1 
#4  2  2 2, 7 
#5  3  2 3, 6 

或者對結果怎麼樣dlply列表...

dlply(DT , .(User_ID,Exec_No) , summarise , "User" = User_ID , "Exec" = Exec_No , "Job_Nos" = unique(Job_No) ) 

#$`1.1` 
# User Exec Job_Nos 
#1 1 1  5 
#2 1 1  8 

#$`1.2` 
# User Exec Job_Nos 
#1 1 2  4 

#$`2.1` 
# User Exec Job_Nos 
#1 2 1  1 

#$`2.2` 
# User Exec Job_Nos 
#1 2 2  2 
#2 2 2  7 

#$`3.2` 
# User Exec Job_Nos 
#1 3 2  3 
#2 3 2  6