基于较大Data.Frame的多个子集创建多个列表

Eco*_*tis 4 r subset plyr

在R中工作,我有与下面类似结构的数据(代码块1).我正在寻找一个具有以下特征的新data.frame:

对于每个唯一的ID_1值,我想要有两个新列,一个包含(ID_2共享ID_1和方向== 1)的列表,另一列包含一个列表(ID_2共享ID_1和方向== 0) ),(见下一个代码块2)

数据集块1(初始):

ID_1    ID_2    Direction
100001  1           1
100001  11          1
100001  111         1
100001  1111        0
100001  11111       0
100001  111111      0
100002  2           1
100002  22          1
100002  222         0
100002  2222        0
100003  3           1
100003  33          1
100003  333         1
100003  3333        0
100003  33333       0
100003  333333      1
100004  4           1
100004  44          1
Run Code Online (Sandbox Code Playgroud)

转换成:

数据集块2(所需输出):

ID_1    ID_2_D1             ID_2_D0
100001  1,11,111            1111,11111,111111
100002  2,22                222,222
100003  3,33,333,333333     3333,33333
100004  4,44    
Run Code Online (Sandbox Code Playgroud)

我有代码执行此操作,(采用子集子集的循环),但我在数百万个独特的"ID_1"上运行这个,这使得这非常耗费时间(小时,我告诉你!!).

任何建议 - 也许使用apply()或plyr()包可能会让它运行得更快?


代码:

DF <- data.frame(ID_1=c(100001,100001,100001,100001,100001,100001,100002,100002,100002,100002,100003,100003,100003,100003,100003,100003,100004,100004)
                   ,ID_2=c(1,11,111,1111,11111,111111,2,22,222,2222,3,33,333,3333,33333,333333,4,44)
                   ,Direction=c(1,1,1,0,0,0,1,1,0,0,1,1,1,0,0,1,1,1)
                   )
Run Code Online (Sandbox Code Playgroud)

我目前的(太慢)代码:

  DF2 <- data.frame( ID_1=DF[!duplicated(DF$ID_1),][,1])

  for (i in 1:length(unique(DF2$ID_1))){
    DF2$ID_2_D1[i] <- list(subset(DF,ID_1==unique(DF2$ID_1)[i] & Direction==1)$ID_2)
    DF2$ID_2_D0[i] <- list(subset(DF,ID_1==unique(DF2$ID_1)[i] & Direction==0)$ID_2)        
  }
Run Code Online (Sandbox Code Playgroud)

flo*_*del 7

像这样:

library(reshape2)
dcast(DF, ID_1 ~ Direction, value.var = "ID_2", list)
#     ID_1                   0                  1
# 1 100001 1111, 11111, 111111         1, 11, 111
# 2 100002           222, 2222              2, 22
# 3 100003         3333, 33333 3, 33, 333, 333333
# 4 100004                                  4, 44    
Run Code Online (Sandbox Code Playgroud)