Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 对具有两列作为因子的data.table应用函数_R_Data.table - Fatal编程技术网

R 对具有两列作为因子的data.table应用函数

R 对具有两列作为因子的data.table应用函数,r,data.table,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 现在,对于不同的(用户ID,执行编号

我有一个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
现在,对于不同的(用户ID,执行编号)组合,我需要一个属于该类别的所有作业编号的向量

 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)) 
 ) 
我希望操作的输出是一个列表列表


考虑到input data.table将有大约50万行,我如何快速地在R中实现这一点?

我认为您需要的是类似这样的内容,但同样很难从问题中判断:

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

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


getJobNo(3, 2)
setkey(DT,“用户ID”,“执行编号”)

getJobNo我想你要找的是这样的东西,但同样很难从问题中分辨出来:

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

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


getJobNo(3, 2)
setkey(DT,“用户ID”,“执行编号”)

getJobNo您可以使用
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

您可以使用
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
给你:

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]
给你:

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]

您好,您的起始输入和期望输出不是很清楚。你能帮我吗clarify@RicardoSaporta我已经编辑了我的问题。嗨,你的起始输入和期望输出不是很清楚。你能帮我吗clarify@RicardoSaporta我已经编辑了我的问题。+1-很好。我仍然觉得很难恢复理智。请告诉我如何使用ddply获得结果?i、 e.a
data.table
其中结果行是作业编号列表?我就是想不出来,明白了
dt[,list(result=list(job.nos=job.no)),by=list(user.id,exec.no)]
谢谢-我(大部分)看到你现在做了什么。是的,哇,那是很多嵌套列表。虽然OP要求列表,但我认为,
dt[,list(list_o_jobnos=list(unique(job.no)))by=“user.id,exec.no”]
的输出看起来更干净。@Frank是的,我不经常使用列表,所以我不确定OP为什么想要这样,但不管怎样,我认为理解如何从
数据表中获取这些数据是有用的。弗兰克,我也同意。列表是一种过度的杀伤力。我同意你的建议。我仍然觉得很难恢复理智。请告诉我如何使用ddply获得结果?i、 e.a
data.table
其中结果行是作业编号列表?我就是想不出来,明白了
dt[,list(result=list(job.nos=job.no)),by=list(user.id,exec.no)]
谢谢-我(大部分)看到你现在做了什么。是的,哇,那是很多嵌套列表。虽然OP要求列表,但我认为,
dt[,list(list_o_jobnos=list(unique(job.no)))by=“user.id,exec.no”]
的输出看起来更干净。@Frank是的,我不经常使用列表,所以我不确定OP为什么想要这样,但不管怎样,我认为理解如何从
数据表中获取这些数据是有用的。弗兰克,我也同意。列表是一种过度的杀伤力。我同意你的建议。