我正在使用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循环更快的方式完成吗???
答案 0 :(得分:1)
由于比较中的舍入错误,df2$V1
,df2$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
和? 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))) {
...
}
我认为对于大表,这种方法会更有效率,因为它避免了比较df1
和df2
的每一行。