Re: [問題] 幾個資料預處理問題

看板R_Language作者 (討厭有好心推文後刪文者)時間9年前 (2015/04/22 18:29), 編輯推噓3(304)
留言7則, 3人參與, 最新討論串3/3 (看更多)
※ 引述《sinclairJ (Jun)》之銘言: : 不好意思,又要來請教各位先進了 : 資料檔大概格式如下(均是類別型資料) : (實際資料約為200列乘500000行) : ---------------------------- : 序 Y X1 X2 X3 : 1 1 0 1 2 : 2 1 0 0 0 : 3 2 2 1 1 : 4 1 1 1 2 : 5 2 0 2 2 : 6 2 1 1 2 : 7 2 1 0 1 : 8 1 2 1 1 : 9 1 1 2 0 : 10 2 0 0 2 : ...... : ...... : ..... : ----------------------------- : 以下有幾個互相獨立的資料處理動作要請教各位: : (1)如表格所示,Y有兩種類別,X有三種類別,我想做的處理是比較Y的兩種類別,其他 : 們的X變數是否為同樣類別 : 舉例: Y X1 X2 X3 : 1 0 1 2 : 1 0 2 2 : 2 0 0 1 : 2 0 1 1 : 然後因為X1都一樣,所以我要把X1刪除,請問這個預處理該如何於R上實現? 假如該 data frame 叫 dt 好了。 dt <- data.frame( Y = c(1,1,2,2), X1 = c(0,0,0,0), X2 = c(1,2,0,1), X3 = c(2,2,1,1) ) 可以利用 length(table(dt$X1)) > 1 這個運算來測試 X1 是不是非全等。 懂這個技巧後,套用 apply(dt, 2, function(.){length(table(.))}) > 1 就可以知道哪些欄是要保留的欄位。 合起來寫就是 dt1 <- dt[, apply(dt, 2, function(.){length(table(.))}) > 1] dt1 為所求。 : (2)接下來我要對每個X變數做類似這樣的處理 : 舉例: X1 : 0 : 1 : 2 : 1 : 2 : 2 : 1 : 2 : 1 : 1 : 先找出最少的類別,其所佔的比例 : 如X1最少的類別是0,比例為1/10,1/10就是我想得到的,只是迴圈不太明白該怎麼寫 同樣舉例子給你。 dt2 <- data.frame( X1 = c(0,1,2,1,2,2,1,2,1,1), X2 = c(0,1,1,1,1,1,1,1,1,2), X3 = c(0,0,0,0,0,1,1,2,2,2) ) sort(table(dt2$X1))[1] / length(dt2$X1) 可以看出 0 佔 10% 最少。 所以,再套 apply(dt2, 2, function(.){sort(table(.))[1] / length(.)} ) 即為所求。 想看看是誰佔最少則使用 apply(dt2, 2, function(.){attr(sort(table(.))[1], "names")}) 不過,dt2$X2 中 0 和 2 都是最少者,但這個方法沒辦法知道。 : (3)X變數做C取2組合方式(兩兩相互)對Y做邏輯斯迴歸(這邊的X可轉成數值型資料來處 : 理) : 舉例 : Y X1 X2 X3 : 1 2 1 0 : 2 1 0 1 : 3 2 0 0 : 如果資料是上述這樣 : 我就要建立三條迴歸 : Y~X1+X2 : Y~X2+X3 : Y~X1+X3 : 之後把顯著(p<0.05)的X變數挑出來 Y 是 1,2,3... 怎麼做 logistic regression? 是不是請你再確定? 我建個資料用來示範: dt <- data.frame( Y = c(0,0,0,0,0,1,1,1), X1 = runif(8), X2 = runif(8), X3 = runif(8) ) n 球中抽出且不放回 k 球的所有組合可以用這個方式:combn(n, k) 因為你的 names(dt) 是 "Y" "X1" "X2" "X3", 那就是 3 球中抽 2 球,共有種情況: dt.x <- dt[, which(names(dt) != "Y")] mat <- combn(names(dt.x), 2) 最後再把 mat 拚成 formula 字串: str <- paste0("Y ~ ", apply(mat, 2, paste, sep = "", collapse = " + ")) 就生成三個 formula 前身字串。 最後要做 logistic regression: mod <- list() for(i in 1:length(str)){ mod[[i]] <- glm(as.formula(str[i]), data = dt, family = binomial) } lapply(mod, summary) : 希望各位先進能指導指導小弟 : 若問題描述還不夠清楚 : 我會再補充,先跟版上各位先進說聲謝謝了 -- http://apansharing.blogspot.com/ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.230.77.34 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1429698574.A.64E.html

04/22 18:51, , 1F
推詳細說明
04/22 18:51, 1F

04/22 18:55, , 2F
我覺得他3的Y只是打錯,我用他上面的資料...
04/22 18:55, 2F

04/22 19:34, , 3F
阿阿Y打錯了沒錯,抱歉
04/22 19:34, 3F

04/22 19:34, , 4F
也謝謝兩位前輩指教
04/22 19:34, 4F

04/23 11:34, , 5F
因為你的資料不少,所以如果哪裡算不動記得回報一下。
04/23 11:34, 5F

04/24 09:23, , 6F
哈哈我已經先把大資料拆成數個小部分跑分析了,暫時還
04/24 09:23, 6F

04/24 09:23, , 7F
可以處理,謝謝你!
04/24 09:23, 7F
文章代碼(AID): #1LDtWEPE (R_Language)
文章代碼(AID): #1LDtWEPE (R_Language)