2016-11-02 211 views
0
function(q,b,Data1,Data2){ 
x<-sum(
    ifelse(Data1[13+q,b]/Data1[12+q,b]>Data2[13+q,1]/Data2[12+q,1],1,0)+ 
    ifelse(Data1[13+q,b]/Data1[11+q,b]>Data2[13+q,1]/Data2[11+q,1],1,0)+ 
    ifelse(Data1[13+q,b]/Data1[10+q,b]>Data2[13+q,1]/Data2[10+q,1],1,0)+ 
    ifelse(Data1[13+q,b]/Data1[9+q,b]>Data2[13+q,1]/Data2[9+q,1],1,0)+ 
    ifelse(Data1[13+q,b]/Data1[8+q,b]>Data2[13+q,1]/Data2[8+q,1],1,0)+ 
    ifelse(Data1[13+q,b]/Data1[7+q,b]>Data2[13+q,1]/Data2[7+q,1],1,0)+ 
    ifelse(Data1[13+q,b]/Data1[6+q,b]>Data2[13+q,1]/Data2[6+q,1],1,0)+ 
    ifelse(Data1[13+q,b]/Data1[5+q,b]>Data2[13+q,1]/Data2[5+q,1],1,0)+ 
    ifelse(Data1[13+q,b]/Data1[4+q,b]>Data2[13+q,1]/Data2[4+q,1],1,0)+ 
    ifelse(Data1[13+q,b]/Data1[3+q,b]>Data2[13+q,1]/Data2[3+q,1],1,0)+ 
    ifelse(Data1[13+q,b]/Data1[2+q,b]>Data2[13+q,1]/Data2[2+q,1],1,0)+ 
    ifelse(Data1[13+q,b]/Data1[1+q,b]>Data2[13+q,1]/Data2[1+q,1],1,0) 
)/12 
} 

有沒有辦法簡化這個? (字符,只有在數據集數)需要幫助簡化,重複代碼

謝謝

+1

是的,你不需要'ifelse'。如果用邏輯值進行運算,R會自動強制爲數字。然後你可以使用'mean'而不是'sum(...)/ 12'。可能還有更多,但如果我試着理解你的代碼在做什麼,我的眼睛就會黯然失色。 – Roland

回答

2

兩片,你可以結合改進代碼:

首先,你可以用一個矢量來劃分單個數字,並且R將返回一個具有元素劃分的矢量。例如:

5/c(1,2,3,4,5,6) 
# [1] 5.0000000 2.5000000 1.6666667 1.2500000 1.0000000 0.8333333 

的分子對不等式的兩邊都一樣的時候,你可以使用上面。因此,不要爲每一個不平等而明確地調用它,而只需調用一次即可。當您嘗試進行算術運算(你的情況劃分,或計算平均)

其次,與TRUEFALSE表達式將強制爲10。不等式返回TRUEFALSE值。明確告訴R將它們轉換爲01會浪費能源,因爲R會在您最後一步自動完成。

在簡化功能把這樣一起

function(q, b, Data1, Data2){ 
    qseq <- (1:12) + q # Replaces all "q+1", "q+2", ... , "q+12" 

    dat1 <- Data1[qseq, b] # Replaces all "Data1[q+1, b]", ... "Data1[q+12, b]" 
    dat2 <- Data2[qseq, 1] # Replaces all "Data2[q+1, 1]", ... "Data2[q+12, 1]" 

    mean(Data1[13+q, b]/dat1 > Data2[13+q, 1]/dat2) 
+0

完美無缺!和快!謝謝! – jamie

0

這簡化了一下:

function(q,b,Data1,Data2){ 
    data1_num <- Data1[13+q,b] 
    data2_num <- Data2[13+q,1] 
    x <- 0 
    for (i in 1:12) { 
     x <- x + ((data1_num/Data1[i+q,b]) > (data2_num /Data2[i+q,1])) 
    } 
    x <- x /12 
    #return(x) 
} 

,但如果你提供的數據爲例,輸出你的期待,我敢肯定有辦法簡化它的知識更好

+0

這個工作!謝謝。 – jamie