Re: [程式] R中的if條件
如果運算不複雜,又找不到好的vectorize的方式
就可以請Rcpp出場了
以下搭配inline套件服用
※ 引述《piq (享)》之銘言:
: 感謝大家的建議
: 其實一開始最簡單的方法是用for
: 但是因為真實在跑分析時
: v[,1]的長度大約是17萬6000個
: 也就是說v是一個176000x20up的矩陣
假設是v是numeric
: 如果這時候用for(i 1:length(v[,1]))是可以跑...
: 但是會跑非常久~我並不想要這樣
: 而A,B兩運算是要把v[,1]重新編程一個號碼 只是規則不同
: 有想過用ifelse但似乎是失敗了
: ifelse(v[,1]==a,A,B)
: 分析上 A運算是:v[i,1]-a
: B運算是:12-a+v[i,1]
library(Rcpp)
library(inline)
v <- matrix(rnorm(176000*20), 176000, 20)
v[,1] <- sample(1:10, 176000, TRUE)
f_R <- function(v, a) {
for(i in 1:nrow(v)) {
if (v[i,1] == a) {
v[i,1] <- v[i,1] - a
} else {
v[i,1] <- 12 - a + v[i,1]
}
}
return(v)
}
f_Rcpp <- cxxfunction(sig=c(Rv = "numeric", Ra = "numeric"), plugin="Rcpp",
body='
NumericMatrix v(Rv);
double a(as<double>(Ra));
for(int i = 0;i < v.nrow();i++) {
if (v(i,0) == a) {
v(i,0) = v(i,0) - a;
}
else {
v(i,0) = 12 - a + v(i,0);
}
}
')
system.time({v_R <- f_R(v, 1)}) # 1.228秒
system.time(f_Rcpp(v, 1)) # Rcpp版本會直接改v本身, 0.001秒
all.equal(v_R, v) # 一樣
: 所以我當初是寫成: ifelse(v[,1]==a,v[i,1]-a,12-a+v[i,1])
: 但是不能跑..
: 莫非是ifelse裡面不能用邏輯算式?
: 還有是recodes指令...
: 我的R只接跟我說沒有這個指令 囧
: 所以我在想是否還有其他的方法~"~
: : [軟體程式類別]:
: : R
: : [程式問題]:
: : if條件問題
: : [軟體熟悉度]:
: : 低(1~3個月)
: : [問題敘述]:
: : v是一個矩陣
: : a是一個我們任意給的數(已知)
: : 今天我希望v中的某行(假設第一行) 中的各元素做是否等於a的判斷運算
: : 我希望能在不用for下 完成我想要的運算
: : 但是一直想不出
: : [程式範例]:
: : 以下為大略範例
: : +if(v[,1]==a){執行A運算}
: : +else{執行B運算}}
: : Warning message:
: : In if (a == v[, 1]) { :
: : 條件的長度 > 1,因此只能用其第一元素
: : ===
: : 想請問高手能有辦法步用for的狀況下
: : 比對v[,1]中的元素是否等於a做邏輯運算嗎?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.230.45.47
※ 編輯: Wush978 來自: 61.230.45.47 (03/21 00:36)
推
03/21 20:18, , 1F
03/21 20:18, 1F
討論串 (同標題文章)