在data.table上应用函数,有两列作为因子

时间:2013-05-02 14:46:30

标签: r data.table

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

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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

答案 2 :(得分:1)

我认为你所寻找的是这样的,但同样很难从这个问题中得知:

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

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


getJobNo(3, 2)