如何在R中的循环中运行具有可变长度的多个参数的函数

时间:2019-01-11 05:50:08

标签: r function

我需要在所有迭代中将此函数运行6000次。我总共有6个参数用于该函数。它们的前三个并存,数字为75。下一个参数有9个值。最后2个参数有3个值。

#require dplyr
#data is history as list
matchloop <- function(data, data2, x, a, b, c) {
 #history as list
 split <- data
 #history for reference
 fh <- FullHistory
 #start counter
 n<-1
 #end counter
 m<-a
 tempdf0.3 <- fh
 #set condition for loop
 while(nrow(tempdf0.3) > 1 && m <= (nrow(data2))*b) {
   #put history into a variable
   tempdf0.0 <- split
   #put fh into a variable
   tempdf0.5 <- fh
   #put test path into variable from row n to m
   tempdf0.1 <- as.data.frame(data2[n:m,], stringsAsFactors = FALSE)
   #change column name of test path
   colnames(tempdf0.1) <- "directions"
   #put row n to m of history into variable
   tempdf0.2 <- lapply(tempdf0.0, function(df) df[n:m,])
   #put output into output
   tempdf0.3 <- orderedDistancespos(tempdf0.2, tempdf0.1, 
   "allPaths","directions")
   #add to output routeID based on reference from fh-the test path ID
   tempdf0.3 <- mutate(tempdf0.3, routeID = (subset(tempdf0.5, routeID 
   != x)$routeID))
   #reduce output based on the matched threshold
   tempdf0.3 <- subset(tempdf0.3, dists >= a*c)
   #create new history based on the IDs remaining in output
   split <- split[as.character(tempdf0.3$routeID)]
   #create new history for reference based on the IDs remaining in 
   output
   fh <- subset(fh, routeID %in% tempdf0.3$routeID)
   #increase loop counter
   n <- n+a
   #increase loop counter
   m <- n+(a-1)
 }
#show output
mylist <- list(tempdf0.3, nrow(tempdf0.3))
return(mylist)
}

我尝试将其中包含75个元素的3个参数放到自己的列表中,并使用mapply。这可行。但是即使在这个级别,我仍然必须运行81次代码以覆盖所有变量,因为据我所知,基于最长参数的长度,mapply循环。

mapply(matchloop, mylist2,mylist3,mylist4, MoreArgs = list(a=a, b=b, c=c))

数据是数据帧的列表

data2是一个数据框

x,a,b,c均为数字。

现在,我正在尝试简化输出,以便仅输出1行。因此,如果可能的话,我希望所有6000条以上的行都输出1个csv。

1 个答案:

答案 0 :(得分:0)

您可以组合使用mapplyapply函数来循环遍历abc变量的所有可能组合。要创建所有可能的组合,可以使用expand.grid。最后,您可以借助listdata.frame函数,将do.call行合并为rbind,如下所示:

matchloop_stub <- matchloop <- function(data, data2, x, a, b, c) {
  # stub
  c(d = sum(data), d2 = sum(data2), x = sum(x), a = a, b = b, c = c, r = a + b + c)
}

set.seed(123)
mylist2 <- replicate(75, data.frame(rnorm(1)))
mylist3 <- replicate(75, data.frame(rnorm(2)))
mylist4 <- replicate(75, data.frame(rnorm(3)))
a <- 1:9 
b <- 1:3
c <- 1:3
abc <- expand.grid(a, b, c)
names(abc) <- c("a", "b", "c")
xs <- apply(abc, 1, function(x) (mapply(matchloop_stub, mylist2, mylist3, mylist4, x[1], x[2], x[3], SIMPLIFY = FALSE)))
df <- do.call(rbind, do.call(rbind, xs))

write.csv(df, file = "temp.csv")
res <- read.csv("temp.csv")
nrow(res)
# [1] 6075

head(res)
#   X          d        d2         x a b c r
# 1 1 -0.5604756 0.7407984 -1.362065 1 1 1 3
# 2 2 -0.5604756 0.7407984 -1.362065 2 1 1 4
# 3 3 -0.5604756 0.7407984 -1.362065 3 1 1 5
# 4 4 -0.5604756 0.7407984 -1.362065 4 1 1 6
# 5 5 -0.5604756 0.7407984 -1.362065 5 1 1 7
# 6 6 -0.5604756 0.7407984 -1.362065 6 1 1 8