我刚刚读到,矢量化可以提高性能并显着降低计算时间,而在if()的情况下,最好的选择是ifelse()。
我的问题是我在for循环中得到了一些if语句,每个if语句包含多个赋值,如下所示:
x <- matrix(1:10,10,3)
criteria <- matrix(c(1,1,1,0,1,0,0,1,0,0,
1,1,1,1,1,0,0,1,1,0,
1,1,1,1,1,1,1,1,1,1),10,3) #criteria for the ifs
output1 <- rep(list(NA),10) #storage list for output
for (i in 1:10) {
if (criteria[i,1]>=1) {
output1[[i]] <- colMeans(x)
output1[[i]] <- output1[[i]][1] #part of the somefunction output
} else {
if(criteria[i,2]>=1) {
output1[[i]] <- colSums(x)
output1[[i]] <- output1[[i]][1] #the same
} else {
output1[[i]] <- colSums(x+1)
output1[[i]] <- output1[[i]][1] #the same
}}}
我怎样才能将其转化为ifelse?
提前致谢!
答案 0 :(得分:2)
请注意,您不需要for循环,因为所有使用的操作都是矢量化的:
output2 <- ifelse(criteria[, 1] >= 1,
colMeans(x)[1],
ifelse(criteria[, 2] >= 1,
colSums(x)[1],
colSums(x+1)[1]))
identical(output1, as.list(output2))
## [1] TRUE
答案 1 :(得分:0)
至少可以将两个作业转换为一个。而不是
output[[i]] <- somefunction(arg1,arg2,...)
output[[i]] <- output[[i]]$thing #part of the somefunction output
您可以直接参考您感兴趣的唯一部分。
output[[i]] <- somefunction(arg1,arg2,...)$thing #part of the somefunction output
希望它有所帮助!
答案 2 :(得分:0)
我似乎找到了试图构建示例的答案:
output2 <- rep(list(NA),10) #storage list for output
for (i in 1:10) {
output2[[i]] <- ifelse(criteria[i,1]>=1,
yes=colMeans(x)[1],
no=ifelse(criteria[i,2]>=1,
yes=colSums(x)[1],
no=colSums(x+1)[1]))}