【问题标题】:Looping function with left_join over multiple variablesleft_join 在多个变量上的循环函数
【发布时间】:2022-02-18 10:57:30
【问题描述】:

我正在基于 R 中的多个变量在数据帧上迭代地循环包含 left_join 的函数。当我在数据帧上逐行运行该函数时,该函数起作用,但在循环中分解。我需要自动化这个过程,因为我必须运行它数百次,但我在使用 foreach 和 mapply 时遇到了错误。

原始数据集和原始函数的一部分是这样的:

 library(tidyverse)  
    ID <- c(22226820,22226820,22226814,22226814)
        ID_US_1 <- c(22226830,22226818,22226816,22226832)
        mydf <- data.frame(cbind(ID==as.character(ID),ID_US_1=as.character(ID_US_1)))
        
        
        ID_key <- c(22226830,22226818,22226818,22226816,22226816,22226832,22226832,22226806,22226806,22226814,22226814,22226804)
        ID_key_US <- c(0,22226806,22226814,22226804,22226802,22226840,22226842,22226798,22226796,22226816,22226832,22227684)
        
        mykey <- data.frame(cbind(ID_key=as.character(ID_key),ID_key_US=as.character(ID_key_US)))
        
        
        myfx <- function(iteration_prior,iteration){
          # iteration_prior <- "1"
          #  iteration <- "2"
          varnameprior <- paste0("ID_US","_",iteration_prior)
          varname <- paste0("ID_US","_",iteration)
          
          colnames(mykey) <- c(varnameprior,varname)
          
          mydf <-mydf %>% 
                left_join(x=.,y=mykey,by=varnameprior)  
         
          mydf[,ncol(mydf)][is.na(mydf[,ncol(mydf)])] <- 0
          mydf[,ncol(mydf)]<-as.character(mydf[,ncol(mydf)])
        
          
          return(mydf)
        }
        
        prior <- c(1,2,3)
        current <- c(2,3,4)
        mylist <- data.frame(cbind(prior=prior,current=current))
        
        mydf <- myfx(prior[1],current[1])
        mydf <- myfx(prior[2],current[2])

这将创建我想要的输出,即迭代的数据列。 ID_US_2 是根据 ID_US_1 使用 mykey 数据帧计算出来的,ID_US_3 是使用 ID_US_2 和 mykey 计算出来的。

我需要执行此操作数百次,这意味着我需要自动化该过程。我尝试了一个 foreach 循环并得到了“数据中必须存在连接列”的错误。我认为这意味着我的新输出没有正确修改数据框。我遇到了与 mapply 相同的错误/问题。

    library(foreach)  
    foreach(i=prior,j=current) %do% {myfx(i,j)}

我也考虑过嵌套的 for 循环,但被多个变量挂起(而 foreach/mapply 似乎更适合)。

【问题讨论】:

  • 试图并行化依赖于先前迭代的操作注定会失败。您要么必须删除这种依赖关系,要么使用标准循环运行它。

标签: r for-loop foreach left-join mapply


【解决方案1】:

我认为您唯一的问题是您没有在 foreach 命令中重新分配 mydf。编辑它,你有:

foreach(i=prior, j=current) %do% {mydf <- myfx(i,j)}

【讨论】:

    猜你喜欢
    • 2020-08-15
    • 2016-04-22
    • 1970-01-01
    • 2011-10-21
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多