【发布时间】: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