[程式] R中的if條件

看板Statistics作者 (享)時間12年前 (2013/03/19 16:35), 編輯推噓5(5031)
留言36則, 6人參與, 最新討論串1/5 (看更多)
[軟體程式類別]: R [程式問題]: if條件問題 [軟體熟悉度]: 低(1~3個月) [問題敘述]: v是一個矩陣 a是一個我們任意給的數(已知) 今天我希望v中的某行(假設第一行) 中的各元素做是否等於a的判斷運算 我希望能在不用for下 完成我想要的運算 但是一直想不出 [程式範例]: 以下為大略範例 >test<-function(v,a){ +if(v[,1]==a){執行A運算} +else{執行B運算}} > Warning message: In if (a == v[, 1]) { : 條件的長度 > 1,因此只能用其第一元素 === 想請問高手能有辦法步用for的狀況下 比對v[,1]中的元素是否等於a做邏輯運算嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.85.83.97

03/19 16:39, , 1F
for (i in 1:length(v[,1])) {
03/19 16:39, 1F

03/19 16:39, , 2F
if (v[i,1]==a) {A運算}
03/19 16:39, 2F

03/19 16:40, , 3F
else {B運算}
03/19 16:40, 3F

03/19 16:40, , 4F
}
03/19 16:40, 4F

03/19 16:41, , 5F
沒看到不用for,我還以為指定用for
03/19 16:41, 5F

03/19 16:43, , 6F
要做A運算的DATA=v[v[,1]==a,]
03/19 16:43, 6F

03/19 16:43, , 7F
要做B運算的DATA=v[v[,1]!=a,]
03/19 16:43, 7F

03/19 16:44, , 8F
像上面那樣分兩個DATA處理吧
03/19 16:44, 8F

03/19 16:54, , 9F
看不太懂樓上DATA的想法 DATA是指邏輯算式?
03/19 16:54, 9F

03/19 17:34, , 10F
從問題的敘述中我不確定 all(a == v[,1]) 是不是你要的
03/19 17:34, 10F

03/19 17:38, , 11F
直接下 matrix[,1] = a 會返回一個邏輯向量
03/19 17:38, 11F

03/19 17:39, , 12F
還是要全都等於a才做第一個算式?
03/19 17:39, 12F

03/19 19:47, , 13F
apply(v,2,function(vector){vector==a})
03/19 19:47, 13F

03/19 19:47, , 14F
apply(v==a,2,which)
03/19 19:47, 14F

03/19 20:12, , 15F
應該說是立即判斷 如果==a 就執行A !=a 就執行B
03/19 20:12, 15F

03/19 20:31, , 16F
就是v[i,1]==a 執行A 反之B 是否有可以不用for的方法?
03/19 20:31, 16F

03/19 22:31, , 17F
寫是可以寫 用雙apply可以取代雙回圈 但重點是你的分析
03/19 22:31, 17F

03/19 22:31, , 18F
會花多少資源 用apply不會比回圈快
03/19 22:31, 18F

03/19 22:32, , 19F
apply(v,2,function(x){apply(as.matrix(x),1,fx)}
03/19 22:32, 19F

03/19 22:32, , 20F
把你的分析包在 fx 這個 function 裡面就可以
03/19 22:32, 20F

03/20 08:55, , 21F
我現在改用一樓的方法 但是跑非常久 其實自己也知道最簡單的
03/20 08:55, 21F

03/20 08:56, , 22F
方法是for 但是v[,1]的長度非常大 所以不是很想要用這招
03/20 08:56, 22F

03/20 11:03, , 23F
這是你想要的 ?
03/20 11:03, 23F

03/20 11:03, , 24F
x <- array(
03/20 11:03, 24F

03/20 11:03, , 25F
sample(1 : 5, 30, replace = TRUE),
03/20 11:03, 25F

03/20 11:03, , 26F
dim = c(10, 3)
03/20 11:03, 26F

03/20 11:04, , 27F
)
03/20 11:04, 27F

03/20 11:04, , 28F
AAA <- function(x) paste(x, "A運算")
03/20 11:04, 28F

03/20 11:04, , 29F
BBB <- function(x) paste(x, "B計畫")
03/20 11:04, 29F

03/20 11:04, , 30F
y <- ifelse(x[, 1] > 3, AAA(x), BBB(x))
03/20 11:04, 30F

03/20 11:04, , 31F
y
03/20 11:04, 31F

03/20 11:09, , 32F
要等於a, 就把 > 3 改成 == a 這樣就是了
03/20 11:09, 32F

03/20 17:12, , 33F
為什麼不分成兩個檔案跑呢? 我覺得你描述的清楚一點會
03/20 17:12, 33F

03/20 17:12, , 34F
對你更有幫助,我覺得我提供的第二個方法也很理想
03/20 17:12, 34F

03/20 17:13, , 35F
我的意思是說,你先把原始檔分成要做A運算的檔案及要做B
03/20 17:13, 35F

03/20 17:13, , 36F
運算的檔案,然後這兩個檔案分別在每列做運算就好了
03/20 17:13, 36F
文章代碼(AID): #1HI2C-ai (Statistics)
文章代碼(AID): #1HI2C-ai (Statistics)