转换excel公式并检查每个行值

时间:2017-08-31 02:43:36

标签: r

我想使用这个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

1 个答案:

答案 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