我想使用这个Excel公式:
=IF(C2>=70,1,IF(D2>=70,-1,IF(E2>=70,-1,IF(F2>=70,0,IF(G2>=70,-1,IF(H2>=70,1,IF(I2>=70,0,999)))))))
我希望检查每个大于70的行值,然后R将给出它们的数字,我可以自动使用下一行中的公式。
此外,该值可能为NA
。
答案 0 :(得分:0)
至少有几种编程功能的方法,我将在下面展示。第一个是写几个if / else语句,第二个是对ifelse()
进行一次非常大的调用。
根据您使用该功能的方式,您也可以通过几种方式调用该功能。第一种方法是使用apply
,然后生成一个基于应用于行的公式计算的值向量。输出中的每个元素都来自相应的矩阵行。您还可以使用for
循环逐行计算值。根据数据的大小,您可能希望比较每种方法的时间,以确定哪种方法最快。
# function to evaluate all the if/else conditions
f1 <- function(x){
if(x[3] >= 70 && is.na(x[3]) == F){
out <- 1
}else if(x[4] >= 70 && is.na(x[4]) == F){
out <- -1
}else if(x[5] >= 70 && is.na(x[5]) == F){
out <- -1
}else if(x[6] >= 70 && is.na(x[6]) == F){
out <- 0
}else if(x[7] >= 70 && is.na(x[7]) == F){
out <- -1
}else if(x[8] >= 70 && is.na(x[8]) == F){
out <- 1
}else if (x[9] >= 70 && is.na(x[9]) == F){
out <- 0
}else{
out <- 999
}
return(out)
}
# function with a single large function call
f2 <- function(x){
out <- ifelse(x[3]>=70&& is.na(x[3]) == F,1,ifelse(x[4]>=70&& is.na(x[4]) == F,-1,ifelse(x[5]>=70&& is.na(x[5]) == F,-1,ifelse(x[6]>=70&& is.na(x[6]) == F,0,ifelse(x[7]>=70&& is.na(x[7]) == F,-1,ifelse(x[8]>=70&& is.na(x[8]) == F,1,ifelse(x[9]>=70&& is.na(x[9]) == F,0,999)))))))
}
# sample data to test function
# A B C D E F G H I
x <- matrix(c( 0, 0, 71, 0, 0, 0, 0, 0, 0,
0, 0, 0, 70, 0, 0, 0, 0, 0,
0, 10, 1, 0, 71, 0, 10, 90, 0,
99, 0, 0, 69, 67, 90, 99, 1, 0,
0, 0, 0, 0, 0, 0, 70, 0, 0,
0, 0, 0, 0, 0, 0, 0, 71, 0,
0, 0, 0, 0, 0, 0, 0, 0, 72,
0, 0, 0, 0, 0, 0, 0, 0, 1,
NA, NA, NA, NA, 1, 70, 0, NA, 0,
NA, NA, NA, NA, NA, NA, NA, NA, NA),nrow=10,ncol=9,byrow=T)
# method 1: using apply and avoiding loop, with timing
ptm <- proc.time()
out_f1_m1 <- apply(X=x,MARGIN=1,FUN=f1)
time_f1_m1 <- proc.time() - ptm
ptm <- proc.time()
out_f2_m1 <- apply(X=x,MARGIN=1,FUN=f2)
time_f2_m1 <- proc.time() - ptm
# method 2: using a for loop
out_f1_m2 <- rep(NA,nrow(x))
out_f2_m2 <- rep(NA,nrow(x))
ptm <- proc.time()
for(i in 1:nrow(x)){
out_f1_m2[i] <- f1(x[i,])
}
time_f1_m2 <- proc.time() - ptm
ptm <- proc.time()
for(i in 1:nrow(x)){
out_f2_m2[i] <- f2(x[i,])
}
time_f2_m2 <- proc.time() - ptm