使用多个参数循环而不使用for循环

问题描述:

下面是我的数据集的微版本。我想在不使用'for'函数的情况下循环三个变量。使用多个参数循环而不使用for循环

主体的重复性版本数据集

cat1 <- rep(c("A","S"),each=40)# First variable 
cat2 <- rep(c("C","M","Y","K"), each=10, times=2) # Second variable 
num1 <- rep(c(0,10,20,30,40,45,65,80,90,100),8) # Third variable 
rspns <-structure(list(dataSet = c(0.2484375, 0.3959375, 0.4875, 0.57875, 0.6696875, 0.694375, 
    0.816875, 0.879375, 0.9121875, 0.93125, 0.25125, 0.3796875, 0.4609375, 0.5396875, 0.6159375, 
    0.6515625, 0.7696875, 0.8384375, 0.864375, 0.8865625, 0.271875, 0.39875, 0.4821875, 
    0.5628125, 0.6284375, 0.650625, 0.7553125, 0.8003125, 0.8103125, 0.8125, 0.251875, 0.3775, 
    0.4703125, 0.5725, 0.6996875, 0.7378125, 0.945, 1.055625, 1.1021875, 1.1140625, 0.25125, 
    0.4203125, 0.5215625, 0.615625, 0.71, 0.74, 0.865625, 0.9246875, 0.9603125, 0.9734375, 
    0.256875, 0.3953125, 0.4775, 0.5528125, 0.62875, 0.65875, 0.78375, 0.8384375, 0.8653125, 
    0.8740625, 0.2790625, 0.4215625, 0.515, 0.6009375, 0.6665625, 0.693125, 0.7959375, 0.83875, 
    0.8490625, 0.8575, 0.2571875, 0.3759375, 0.4665625, 0.56375, 0.68875, 0.725, 0.9259375, 
    1.0328125, 1.085625, 1.1096875)), .Names = "rspns", 
    class = "data.frame", row.names = c(NA, -80L)) 
gain <- data.frame(cat1,cat2,num1, rspns=rspns) 

tint <- function(x,y,z) gain[cat1 == x & cat2 == y & num1 == z, 4] 
dgain <- function(x,y,z){(100* (1-10^-(tint(x,y,z) - tint(x,y,0)))/(1-10^-(tint(x,y,100)- tint(x,y,0)))) - z} 

我怎样才能获得dgain功能,它通过cat1cat2num1变量有三个参数,循环不使用for循环?

非常感谢您的帮助和技术专长。

+0

你为什么不使用'dgain(cat1,cat2,num1)'? – juba 2013-03-12 15:38:59

+0

@juba我认为你的'mapply'回答实际上是可以的(即我不确定它们的功能是否已经被矢量化)。 – joran 2013-03-12 16:09:08

+0

@joran谢谢,但我删除了我的答案,因为它似乎都给出了相同的值。 – juba 2013-03-12 16:10:58

这是我在跟我的意见得到的基本思想:

#With a basic for loop for reference 
out1 <- rep(NA,80) 
for (i in 1:80){ 
    out1[i] <- dgain(cat1[i],cat2[i],num1[i]) 
} 

out2 <- mapply(dgain,x = cat1,y = cat2,z = num1) 

out3 <- dgain(cat1,cat2,num1) 

all.equal(out1,unname(out2)) 
[1] TRUE 
> all.equal(out1,out3) 
[1] "Mean relative difference: 0.2579067" 

这或许可以重构你的代码,使得最终的成语(dgain(cat1,cat2,num1))将返回正确的结果,但它会采取比我有时间更多的修补。问题在于,您正在使用==在您的某个函数内从全局环境中对数据框进行子集化,如果您传递的是矢量参数,则不会返回所需内容。

mapply没什么特别的。它几乎可以和for循环做同样的事情,只是可能稍微更有效一些,也许更美观一些。

+0

乔兰,你是对的,成语(dgain(cat1,cat2,num1))没有提供正确的答案。这就是为什么我有兴趣在mapply或sammply。我应该如何重写函数?手动输入当前功能中的三个参数提供了正确的答案。你能概述我应该做什么吗? – 2013-03-12 17:14:34

+0

@RagyIsaac我向你展示了'mapply'解决方案。我并不是真的有兴趣为你重写你的代码。不过,你可能不得不在'tint'里面用'match'来代替'=='。 – joran 2013-03-12 17:17:47

+0

谢谢乔兰,这对我很有帮助 – 2013-03-16 15:50:51