精華區beta R_Language 關於我們 聯絡資訊
[問題類型]: 程式諮詢(我想用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") D E....約有50組的條件須配對 X1 <- c(3, "M1") X2 <- c(4, "M1") X3 <- c(8, "M3") X4 X5...約有5000筆資料要運算 當X1資料丟進去判斷,得到K1 當X2資料丟進去判斷,得到null 當X3資料丟進去判斷,得到K3 ...以此類推 這個用迴圈寫會比較好?(完全沒頭緒) 謝謝各位前輩 [環境敘述]: R version 3.3.3 (2017-03-06) Windows 7 x64 Service Pack 1 [關鍵字]: R語言多重數據判斷分類 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.169.139.118 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1489666077.A.53B.html ※ 編輯: hizerg (1.169.139.118), 03/16/2017 20:09:57
clsmbstu: X1會得到K1嗎?X1的第一項是5,不在1~3之間。 @@ 03/16 20:52
hizerg: 抱歉我打錯,修正一下 感謝1F 03/16 20:58
※ 編輯: hizerg (1.169.139.118), 03/16/2017 20:59:08 ※ 編輯: hizerg (1.169.139.118), 03/16/2017 22:07:53 > -------------------------------------------------------------------------- < 作者: clsmbstu (missing) 看板: R_Language 標題: Re: [問題] 用R數據條件判斷分類 時間: Thu Mar 16 21:13:06 2017 我的想法是用簡單的條件式去判斷就好,不用寫迴圈。 下面只是把你的目的寫成條件式,再加一個保險,避免丟進去的物件不是兩個元素: #### multiple_judges <- function(x) { if (length(x) != 2) {stop("The input should have 2 elements.")} # 如果丟進去的東西不是兩個值,程式會警告並停止執行 else { if (x[1] >= 1 & x[1] <= 3 & x[2] == "M1") {return("K1")} # 甲介於1~3間,且乙= M1得到K1 else if (x[1] >= 4 & x[1] <= 6 & x[2] == "M2") {return("K2")} # 甲介於4~6間,且乙= M2得到K2 else if (x[1] >= 7 & x[1] <= 9 & x[2] == "M3") {return("K3")} # 甲介於7~9間,且乙= M3得到K3 else {return(NULL)} } } multiple_judges(X1) multiple_judges(X2) multiple_judges(X3) #### 應該可以得到你想要的結果~ ※ 引述《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(5, "M1") : X2 <- c(4, "M2") : 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語言多重數據判斷分類 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.225.139.194 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1489669988.A.D66.html ※ 編輯: clsmbstu (36.225.139.194), 03/16/2017 21:16:27
hizerg: 感謝! 不過我的問題主要是 條件大概有將近50組 03/16 22:05
hizerg: 需要寫變數 所以才思考是不是要用迴圈 03/16 22:05
hizerg: A B C 只是把其中的三組 簡單化寫出 03/16 22:06
hizerg: 這個寫法我也想一下 真的很謝謝願意給一個思考方向 03/16 22:08
clsmbstu: 我的想法跟板主後來的回應有點類似,如果你50個條件都是 03/16 22:38
clsmbstu: 像這樣的格式,那把它們變成data frame的確方便很多, 03/16 22:39
celestialgod: 但這樣寫是有點糟的方式QQ,完全沒有vectorization 03/16 22:39
celestialgod: 筆數不用太多就會跑到哭出來 03/16 22:39
clsmbstu: 我當時只是想簡單問題就簡單解決... 03/16 23:14
> -------------------------------------------------------------------------- < 作者: celestialgod (天) 看板: R_Language 標題: Re: [問題] 用R數據條件判斷分類 時間: Thu Mar 16 22:19:01 2017 ※ 引述《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
hizerg: 感謝版主! 認真想一下怎麼寫 03/16 22:31
hizerg: 共有50組條件 與5000多筆資料要跑 03/16 22:31
如果你條件是上面那樣的五十組,只要資料塞進data.frame,剩下簡單了... 如果是五十個條件,沒有辦法像是你的例子那樣正規化,那就只能寫if-else
hizerg: 這真的提供我一個很棒的方向 起碼讓我知道對的工具 感謝!! 03/16 22:35
你大概就用csv存資料,用read.table讀進來就好了XD
hizerg: 我打算用csv存資料 在整行整行匯入 再用if-else寫寫看 03/16 22:41
hizerg: 不過data.frame和table也需要好好研究 03/16 22:41
一步步來,先學好data.frame + vectorization的程式邏輯... data.table算是滿難的套件 ※ 編輯: celestialgod (36.233.137.157), 03/16/2017 23:37:38