R:在数据帧中组合相同的标识符
我有一个数据框架,有两列,一个标识符和一列名称。每个标识符多次出现在列ID中(见下文) 现在我想创建一个数据帧,如下所示: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 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)