R 对具有两列作为因子的data.table应用函数
我有一个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,执行编号
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.adata.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.adata.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为什么想要这样,但不管怎样,我认为理解如何从数据表中获取这些数据是有用的。弗兰克,我也同意。列表是一种过度的杀伤力。我同意你的建议。