3

我在 R 中使用 plyr 包来执行以下操作:

  • 根据A列和B列从表A中取出一行
  • 从表 B 中找到在 A 列和 B 列中具有相同值的行
  • 将 C 列从表 B 复制到表 A

我已经制作了进度条来显示进度,但是在它显示到 100% 之后它似乎仍在运行,因为我看到我的 CPU 仍然被 RGUI 占用,但它并没有结束。

我的表 A 有大约 40000 行数据,具有唯一的 A 列和 B 列。

我怀疑 plyr 中“split-conquer-combine”工作流程的“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)
  }
4

1 回答 1

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

这仅适用于组合是唯一的。如果不是,您必须先处理好它。如果没有数据,就不可能完全了解您在完整功能中要实现的目标,但是您应该能够将此处给出的逻辑移植到您自己的案例中。

于 2010-10-21T10:07:32.963 回答