我在R中使用plyr包来执行以下操作:
我已经制作了进度条以显示进度,但是在显示为100%后它似乎仍在运行,因为我看到我的CPU仍然被RGUI占用,但它只是没有结束。
我的表A有大约40000行数据,其中包含唯一的A列和B列。
我怀疑plyr中“split-conquer-combine”工作流程的“组合”部分无法处理这40000行数据,因为我可以为另一个包含4000行数据的表做这件事。
有关提高效率的建议吗?感谢。
这是我的代码:
for (loop.filename in (1:nrow(filename)))
{print("infection source merge")
print(filename[loop.filename, "table_name"])
temp <- get(filename[loop.filename, "table_name"])
temp1 <- ddply(temp,
c("HOSP_NO", "REF_DATE"),
function(df)
{temp.infection.source <- abcde[abcde[,"Case_Number"]==unique(df[,"HOSP_NO"]) &
abcde[,"Reference_Date"]==unique(df[,"REF_DATE"]),
"Case_Definition"]
if (length(temp.infection.source)==0) {
temp.infection.source<-"NIL"
} else {
if (length(unique(temp.infection.source))>1) {
temp.infection.source<-"MULTIPLE"
} else {
temp.infection.source<-unique(temp.infection.source)}}
data.frame(df,
INFECTION_SOURCE=temp.infection.source)
},
.progress="text")
assign(filename[loop.filename, "table_name"], temp1)
}
答案 0 :(得分:2)
如果我理解了你想要达到的目标,那么这应该做你想要的,非常快速,没有太多记忆丧失。
#toy data
A <- data.frame(
A=letters[1:10],
B=letters[11:20],
CC=1:10
)
ord <- sample(1:10)
B <- data.frame(
A=letters[1:10][ord],
B=letters[11:20][ord],
CC=(1:10)[ord]
)
#combining values
A.comb <- paste(A$A,A$B,sep="-")
B.comb <- paste(B$A,B$B,sep="-")
#matching
A$DD <- B$CC[match(A.comb,B.comb)]
A
仅当组合是唯一的时才适用。如果他们不是,你将不得不首先照顾。如果没有数据,就很难知道你在整个函数中想要实现的是什么,但是你应该能够将这里给出的逻辑移植到你自己的情况中。