Re: [問題] 用R數據條件判斷分類

看板R_Language作者 (天)時間8年前 (2017/03/16 22:19), 8年前編輯推噓3(302)
留言5則, 1人參與, 最新討論串3/3 (看更多)
※ 引述《hizerg (路過的人)》之銘言: : [問題類型]: : : 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) : : [軟體熟悉度]: : : 入門(寫過其他程式,只是對語法不熟悉) : : [問題敘述]: : 請簡略描述你所要做的事情,或是這個程式的目的 : 多組數值(甲、乙) : 甲介於1~3間,且乙= M1得到K1 : 甲介於4~6間,且乙= M2得到K2 : 甲介於7~9間,且乙= M3得到K3 : 1.產生資料 : A <- c(1, 3, "M1", "K1") : B <- c(4, 6, "M2", "K2") : C <- c(7, 9, "M3", "K3") : X1 <- c(3, "M1") : X2 <- c(4, "M1") : X3 <- c(8, "M3") : 當X1資料丟進去判斷,得到K1 : 當X2資料丟進去判斷,得到null : 當X3資料丟進去判斷,得到K3 : 這個用迴圈寫會比較好?(完全沒頭緒) : 謝謝各位前輩 : : [環境敘述]: : : R version 3.3.3 (2017-03-06) : Windows 7 x64 Service Pack 1 : : [關鍵字]: : : R語言多重數據判斷分類 : 雖然你是新手QQ 如果你連data.frame都不會用,請先去補強R的基本知識... data.frame是R裡面處理字串、數字混合型最方便的型別 而data.table提供記憶體面的相同操作,比data.frame更快 嘗試先把你的資料用data.table表示 然後直接套用data.table的non-equi join,瞬間就可以得到答案了: library(data.table) judgeDT <- data.table(x_lb = c(1, 4, 7), x_ub = c(3, 6, 9), y_cate = paste0("M", 1:3), output = paste0("K", 1:3)) judgeDT # x_lb x_ub y_cate output # 1: 1 3 M1 K1 # 2: 4 6 M2 K2 # 3: 7 9 M3 K3 inputDT <- unique(data.table(X = sample(1:10, 100, TRUE), Y = sample(paste0("M", 1:3), 100, TRUE))) head(inputDT) # X Y # 1: 3 M2 # 2: 10 M3 # 3: 4 M3 # 4: 3 M1 # 5: 6 M3 # 6: 6 M2 judgeDT[inputDT, .(X, Y, output), on = .(x_lb <= X, x_ub >= X, y_cate == Y)] # X Y output # 1: 3 M2 NA # 2: 10 M3 NA # 3: 4 M3 NA # 4: 3 M1 K1 # 5: 6 M3 NA # 6: 6 M2 K2 如果沒辦法接受就直接迴圈吧: judgeDF <- data.frame(x_lb = c(1, 4, 7), x_ub = c(3, 6, 9), y_cate = paste0("M", 1:3), output = paste0("K", 1:3), stringsAsFactors = FALSE) inputDF <- unique(data.frame(X = sample(1:10, 100, TRUE), Y = sample(paste0("M", 1:3), 100, TRUE), stringsAsFactors = FALSE)) inputDF$output <- rep(NA_character_, nrow(input)) for (i in 1L:nrow(inputDF)) { loc <- which(inputDF[i, 1] >= judgeDF[, 1] & inputDF[i, 1] <= judgeDF[, 2] & inputDF[i, 2] == judgeDF[, 3]) if (length(loc) > 0L) { inputDF$output[i] <- judgeDF[loc, 4] } else { inputDF$output[i] <- NA } } -- R資料整理套件系列文: magrittr #1LhSWhpH (R_Language) https://goo.gl/72l1m9 data.table #1LhW7Tvj (R_Language) https://goo.gl/PZa6Ue dplyr(上.下) #1LhpJCfB,#1Lhw8b-s (R_Language) https://goo.gl/I5xX9b tidyr #1Liqls1R (R_Language) https://goo.gl/i7yzAz pipeR #1NXESRm5 (R_Language) https://goo.gl/zRUISx -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.233.137.157 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1489673944.A.37D.html

03/16 22:31, , 1F
感謝版主! 認真想一下怎麼寫
03/16 22:31, 1F

03/16 22:31, , 2F
共有50組條件 與5000多筆資料要跑
03/16 22:31, 2F
如果你條件是上面那樣的五十組,只要資料塞進data.frame,剩下簡單了... 如果是五十個條件,沒有辦法像是你的例子那樣正規化,那就只能寫if-else

03/16 22:35, , 3F
這真的提供我一個很棒的方向 起碼讓我知道對的工具 感謝!!
03/16 22:35, 3F
你大概就用csv存資料,用read.table讀進來就好了XD

03/16 22:41, , 4F
我打算用csv存資料 在整行整行匯入 再用if-else寫寫看
03/16 22:41, 4F

03/16 22:41, , 5F
不過data.frame和table也需要好好研究
03/16 22:41, 5F
一步步來,先學好data.frame + vectorization的程式邏輯... data.table算是滿難的套件 ※ 編輯: celestialgod (36.233.137.157), 03/16/2017 23:37:38
文章代碼(AID): #1OofxODz (R_Language)
討論串 (同標題文章)
文章代碼(AID): #1OofxODz (R_Language)