Re: [問題] 資料分類

看板R_Language作者 (可笑的自以為...)時間10年前 (2014/02/10 11:52), 編輯推噓3(301)
留言4則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《puppy77 ( )》之銘言: : [問題類型]: : 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) : [軟體熟悉度]: : 入門(寫過其他程式,只是對語法不熟悉) : [問題敘述]: : 我有n筆資料,每筆資料都有m個變數,存在data.frame裡面(維度n*m) : 需要依照m個變數的值去做分類,譬如當一筆資料 : V1<0 and V2>V3 and V4 %in% c("W","Z") : 就會分類為第1類 : 類別有很多,大約30類左右 : 希望最後得到一個長度n的向量,向量裡面的數字就是分類的編號 : 原本是想用if else if去做,但似乎不能用在向量上 : 只會對第一筆資料做判斷(這部分我不是非常確定,還請大家糾正) : 所以外面需要套上for迴圈去一筆一筆判斷 : 但因為資料非常多,還是希望能夠以向量的方式下去做 : 我目前的做法是 : result = rep(0,n) #記錄最後分類結果的向量 : fg = rep(T,n) #記錄每一筆資料是否被分類過(已分類F,未分類T) : r1 = 是否符合第1類條件的向量(長度n,內容全是T or F) : result[r1 & fg] = 1 : fg[r1 & fg] = F ^^^^^^^^^^^^^^^^^^^ 有這個動作是因為被分類為類別1者, 有可能會滿足其他分類的條件, 但類別數字較小者較強, 即 若某列資料同時滿足兩個以上的分類條件, 則此列資料被分類為最小編號類! 是這樣子解釋嗎? 如果這就是你要作的事, 可參考以下做法: n <- 100 m <- 10 X <- data.frame(matrix(sample(-10:10,n*m,r=T),n)) names(X) <- paste("V",1:ncol(X),sep="") X[1:5,] result <- rep(0,n) result[ X$V10>5 & X$V5>X$V7 & X$V8 %in% c(3: 6)] <- 30 result[ X$V4>3 & X$V9>X$V2 & X$V2 %in% c(1: 4)] <- 29 # result["第28類條件"] <- 28 # result["第27類條件"] <- 27 ## ## 條件區為必要的部分, 不知道其他高手是否有更精簡的寫法... @@" ## result[ X$V1<0 & X$V2>X$V3 & X$V4 %in% c(5,10)] <- 1 result ## 越強的分類越晚判斷,這樣可以省去你做 "fg[r1 & fg] = F" 動作的必要性! ## 不知道這是不是你要作的事, 好像只有節省一點力氣而已, 參考看看吧! : r2 = 是否符合第2類條件的向量 : result[r2 & fg] = 2 : fg[r2 & fg] = F : 依此類推到最後 : 雖然這個已達到我的要求,不過還是稍嫌麻煩,不知道有無更俐落的寫法? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.73.70.8

02/10 22:11, , 1F
對!!如果同時符合兩種以上的分類是以最小編號為優先
02/10 22:11, 1F

02/10 22:13, , 2F
其實我原本期望得到的答案是類似SQL裡面case when的指令
02/10 22:13, 2F

02/10 22:15, , 3F
不過你的方法完全突破我原本程式的盲點阿!!!!太感謝了!!!
02/10 22:15, 3F

02/11 08:44, , 4F
或是使用sqldf套件用SQL操作data.frame
02/11 08:44, 4F
文章代碼(AID): #1I-4qByB (R_Language)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1I-4qByB (R_Language)