R:在数据帧中组合相同的标识符

R:在数据帧中组合相同的标识符,r,dataframe,R,Dataframe,我有一个数据框架,有两列,一个标识符和一列名称。每个标识符多次出现在列ID中(见下文) 现在我想创建一个数据帧,如下所示: ID Names uc001aag.1 DKFZp686C24272 | DQ786314 | uc001aag.1 uc001aah.2 AK056232 | FLJ00038 | uc001aah.1 | uc001aah.2 uc001aai.1 AY217347 有人能帮我吗 您可以使用聚合: R> aggregate(Names

我有一个数据框架,有两列,一个标识符和一列名称。每个标识符多次出现在列ID中(见下文)

现在我想创建一个数据帧,如下所示:

 ID           Names
uc001aag.1  DKFZp686C24272 | DQ786314 | uc001aag.1
uc001aah.2  AK056232 | FLJ00038 | uc001aah.1 | uc001aah.2
uc001aai.1  AY217347

有人能帮我吗

您可以使用
聚合

R> aggregate(Names ~ ID, data=tmp, FUN=paste, collapse=" | ")
          ID                                         Names
1 uc001aag.1        DKFZp686C24272 | DQ786314 | uc001aag.1
2 uc001aah.2 AK056232 | FLJ00038 | uc001aah.1 | uc001aah.2
3 uc001aai.1                                      AY217347

聚合是一个相当快的方法,但是您可以使用一个有用的解决方案来并行化代码。这可以在Windows上使用
snowfall
轻松完成:

require(snowfall)
sfInit(parallel=TRUE,cpus=2)
sfExport("Data")

ID <- unique(Data$ID)
CombNames <- sfSapply(ID,function(i){
    paste(Data$Names[Data$ID==i],collapse=" | ")
})
data.frame(ID,CombNames)
sfStop()
require(降雪)
sfInit(并行=真,CPU=2)
sfExport(“数据”)

ID@rcs,这个方法很好用,但是我有一个非常大的数据集。有没有办法加快分析速度?感谢使用
plyr
包中的
ddply进行并行化:
ddply(tmp,.(ID),函数(x)粘贴(x$Names,collapse=“|”),.parallel=TRUE)
plyr程序包中的代码给出了以下错误:加载所需程序包:foreach错误:并行plyr操作需要foreach程序包。此外:警告消息:在库中(package,lib.loc=lib.loc,character.only=TRUE,logical.return=TRUE,:没有名为'foreach'
tapply
的包可以使用
snowfall
修改为并行运行。我不确定任何并行化技巧会有多大帮助。在这种情况下,ddply的问题是(450000行被合并成200000行)是合并步骤。拆分步骤可能没有那么昂贵,粘贴也应该不会太糟糕。但是ddply会在生成的小data.frames上重复执行rbind,这是一场灾难,因为它每次都必须重新优化字符串存储。(我想?)最好使用dlply,每次只返回粘贴的字符串,然后unlist()折叠为向量,然后粘贴回ID名称。
require(snowfall)
sfInit(parallel=TRUE,cpus=2)
sfExport("Data")

ID <- unique(Data$ID)
CombNames <- sfSapply(ID,function(i){
    paste(Data$Names[Data$ID==i],collapse=" | ")
})
data.frame(ID,CombNames)
sfStop()
n <- 3000
m <- 3
Data <- data.frame( ID = rep(1:n,m),
                    Names=rep(LETTERS[1:m],each=n))
 # using snowfall for parallel sapply    
 system.time({
   ID <- unique(Data$ID)
   CombNames <- sfSapply(ID,function(i){
     paste(Data$Names[Data$ID==i],collapse=" | ")
   })
   data.frame(ID,CombNames)
 }) 
   user  system elapsed 
   0.02    0.00    0.33 

 # using tapply
 system.time({
   CombNames <- tapply(Data$Names,Data$ID,paste,collapse=" | ")
   data.frame(ID=names(CombNames),CombNames)
 })
   user  system elapsed 
   0.44    0.00    0.44 

 # using aggregate
 system.time(
   aggregate(Names ~ ID, data=Data, FUN=paste, collapse=" | ")
 )
   user  system elapsed 
   0.47    0.00    0.47 

 # using the normal sapply
 system.time({
   ID <- unique(Data$ID)
   CombNames <- sapply(ID,function(i){
     paste(Data$Names[Data$ID==i],collapse=" | ")
   })
   data.frame(ID,CombNames)
 })
   user  system elapsed 
   0.75    0.00    0.75 
CombNames <- sapply(split(Data$Names,Data$ID),paste,collapse=" | ")
data.frame(ID=names(CombNames),CombNames)