如果比较内部超过3个变量

时间:2012-11-19 14:29:31

标签: r

我正在使用R进行一些计算,但我想知道是否可以使用3个变量创建一个if语句。

例如:

for(d3 in unique(df2$V1))
    {
        for(d1 in 1:nrow(df1))
        {   
            for(d2 in 1:nrow(df2))
            {   
                if(df1[d1,]$V1 == df2[d2,]$V2 == d3)
                                    {

                oneV1 = subset(df2, V1==d3)
                minerrV2 =subset(oneV1,erV2==min(V2))       
                minerrV3 =subset(oneV1, erV3==min(V3))

                cverV2 = sum(df1$erV2 <= minerrV2$erV2)
                cverV3 = sum(df1$erV3 <= minerrV3$erV3)

                pV2 = cverV2/nrow(df1)
                pV3 = cverV3/nrow(df1)


    fres <- rbind(fres, data.frame(nV1=df1[d1,]$V1, nV4=df2[d2,]$V4, npV2=pV2,npV3=pV3 ))
                                     }
                         }
                }
        }

除了制作很多if语句之外,还有一种简单的方法可以在R中执行此操作吗?

**EDIT**

这是一种带有特殊参数的排列测试..这可以使用合并以比for循环更快的方式完成吗???

2 个答案:

答案 0 :(得分:1)

  • 由于比较中的舍入错误,df2$V1df2$V2df1$V1应该成为避免“错误”的因素吗?

  • 以数字方式比较2个以上的变量,请参阅? all.equal

    for(d3 in unique(df2$V1)) {
       tmp1 <- df1 [df1$V1 == d3,]
       tmp2 <- df2 [df2$V3 == d3,]
       outer (tmp1$x, tmp2$y, do.something) 
       ## OR:
       tmp1 <- which (df1$V1 == d3)
       tmp2 <- which (df2$V3 == d3)
       outer (tmp1, tmp2, do.something) 
    }
    

这些或阿里方法中的任何一种或?tappy? aggregate? split? mapply或......是否更好取决于您的do.something < / p>

答案 1 :(得分:0)

除了Justin和其他人的上述评论之外,您可以通过执行以下操作来避免使用for循环和if条件:

bar = df2[! duplicated(df2$V1), ]
foo = merge(df1, df2, by.x = "V1", by.y = "V2", incomparables = NA)
foo = merger(foo, bar, by="V1", incomparables=NA)
for (i in seq(nrow(foo))) {
    ...
}

我认为对于大表,这种方法会更有效率,因为它避免了比较df1df2的每一行。