gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:20:45 24 4
gpt4 key购买 nike

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

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

现在我想创建一个像这样的数据框:

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

有人可以帮助我吗?

最佳答案

Aggregate 是一种相当快的方法,但您可以使用 sapply 解决方案来并行化代码。这可以在 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()

并行版本将为您带来额外的加速,但单个 sapply 解决方案实际上比聚合解决方案慢。 Taply 速度稍快一些,但无法使用降雪进行并行化。在我的电脑上:

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
<小时/>

注意:

郑重声明,更好的 sapply-solution 是:

CombNames <- sapply(split(Data$Names,Data$ID),paste,collapse=" | ")
data.frame(ID=names(CombNames),CombNames)

相当于tapply。但并行化实际上会更慢,因为您必须在 sfSapply 内移动更多数据。速度来自于将数据集复制到每个CPU。当您的数据集很大时,您必须记住这一点:您将因使用更多内存而付出速度的代价。

关于R:在数据框中组合相同的标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5946751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com