我在 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)
      }
    

    最佳答案

    如果我正确理解了您要实现的目标,那么这应该可以快速完成您想要的操作,并且不会造成太多的内存损失。

    #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
    

    这仅适用于组合唯一的情况。如果他们不是,你必须先解决这个问题。如果没有数据,就不可能知道您在完整的函数中究竟要实现什么,但是您应该能够将此处给出的逻辑移植到您自己的案例中。

    关于r - R中的plyr在合并过程中非常慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3985242/

    10-12 14:06