【问题标题】:applying function on data.table having two columns as factors在具有两列作为因子的 data.table 上应用函数
【发布时间】:2013-05-02 14:46:29
【问题描述】:

我有一个如下表所示的 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 中快速实现这一点?

【问题讨论】:

  • 您好,目前还不清楚您的起始输入是什么以及您想要的输出是什么。你能澄清一下吗
  • @RicardoSaporta 我已经编辑了我的问题。

标签: r data.table


【解决方案1】:

给你:

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 - 不错。我仍然觉得很难理解 DT 语法。请你能展示你将如何获得我使用 ddply 得到的结果吗?即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 会想要它,但无论如何我认为了解如何从 @987654325 中取出这些列表很有用@
  • @Frank 我也同意。列表列表是一种矫枉过正。我会按照你的建议去做。
【解决方案2】:

您对此冷淡使用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

【讨论】:

    【解决方案3】:

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

    setkey(DT, "User_ID", "Exec_No")
    
    getJobNo <- function(U, E) 
      DT[.(U, E)][, unlist(Job_No)]
    
    
    getJobNo(3, 2)
    

    【讨论】:

      猜你喜欢
      • 2020-07-01
      • 2021-04-21
      • 2021-04-21
      • 2015-08-23
      • 2015-07-08
      • 1970-01-01
      • 2014-10-15
      • 2014-02-12
      • 2015-09-28
      相关资源
      最近更新 更多