2017-08-31 5 views
0

各行の値をチェックします。変換式を得意とし、私はこの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

ようこそスタックオーバーフロー。簡単にできるように[すばらしいR再現可能な例を作る方法](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)を見てくださいあなたを助ける他の人たち。 –

+0

ifelseコマンドをチェックしてください – Mist

+0

ありがとう、私はテーブルの各値をチェックしたいですか? ifelseを使ってforループを使って自動的に値をチェックする方法はたくさんあります。私は情報を見つけましたが、私は本当に理解していません。 – hahakwok

答えて

0

機能のプログラミングには、少なくとも以下の2つの方法があります。最初は複数のif/elseステートメントを記述し、2つ目は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 
+0

ありがとうございます。 – hahakwok

関連する問題