2013-03-12 5 views
-1

다음은 내 데이터 집합의 마이크로 버전입니다. '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} 

내가 for 루프를 사용하지 않고 cat1, cat2num1 변수를 통해 루프, 세 개의 매개 변수를 취하는 dgain 기능을 얻을 수 있습니까?

귀하의 도움과 전문 기술을 높이 평가합니다.

+0

왜'dgain (cat1, cat2, num1)'을 사용하지 않으시겠습니까? – juba

+0

@juba 당신의'mapply' 대답은 실제로 괜찮다고 생각합니다. (즉, 나는 그들의 기능이 이미 벡터화되어 있는지 확신 할 수 없습니다.) – joran

+0

@ joran 고마워요,하지만 둘 다 같은 가치를주는 것 같아 내 대답을 삭제했습니다. – juba

답변

1

여기 내 의견에지고 있었는지의 기본 아이디어 :

#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

joran, 올바른지, 관용구 (dgain (cat1, cat2, num1))가 정답을 제공하지 않습니다. 그래서 나는 mapply 또는 sammply에 관심이 있습니다. 어떻게 함수를 다시 작성해야합니까? 현재 함수에 세 개의 매개 변수를 수동으로 입력하면 정답을 제공합니다. 내가해야 할 일을 설명해 주시겠습니까? –

+0

@RagyIsaac 나는 당신에게'mapply' 해결책을 보여주었습니다. 나는 코드를 다시 작성하는 것에 관심이 없다. 하지만''tint' 안에'=='대신'match'를 써야 할 것입니다. – joran

+0

감사합니다. 조란, 이거 좀 도와 줘. –

관련 문제