0

我正在使用 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 循环更快吗???

4

2 回答 2

1
  • 应该df2$V1df2$V2并且df1$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? mapplydo.something

于 2012-11-19T15:19:01.323 回答
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))) {
    ...
}

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

于 2012-11-19T14:55:49.687 回答