[爆卦]r資料分類是什麼?優點缺點精華區懶人包

為什麼這篇r資料分類鄉民發文收入到精華區:因為在r資料分類這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者celestialgod (天)看板R_Language標題Re: [問題] 用R數據條件判斷分...

r資料分類 在 Dingdong Lee Instagram 的精選貼文

2020-04-21 12:56:49

#這篇是預告請務必看到文末 #週四晚上留給我們 過境盛岡,吃完 @whosming 推薦的白龍じゃじゃ麺,距離前往青森新幹線的時間剩下大約50分鐘,對於獨立書店 @pono_books 太好奇了,我們快速將兩個大行李箱放進寄物櫃,google map標好地標,手機訂好必須回來的鬧鐘,兩人在大雪覆...


※ 引述《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

你可能也想看看

搜尋相關網站