2016-11-02 160 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