1

我有一个如下表所示的 R 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 将有大约一百万行,我如何在 R 中快速实现这一点?

4

3 回答 3

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]
于 2013-05-02T15:18:40.553 回答
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
于 2013-05-02T15:15:25.587 回答
1

我认为你正在寻找的是这样的东西,但同样很难从这个问题中看出:

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

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


getJobNo(3, 2)
于 2013-05-02T14:53:32.353 回答