Re: [問題] 遺失值的問題

看板R_Language作者 (天)時間8年前 (2015/10/12 16:39), 8年前編輯推噓2(202)
留言4則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《morefunmba (開心一點)》之銘言: : [軟體熟悉度]: : 請把以下不需要的部份刪除 : 使用者(已經有用R 做過不少作品) : [問題敘述]: : 請簡略描述你所要做的事情,或是這個程式的目的 : 我有約100個國家,12個變數的資料集 : 大概就是 : 變數1 變數2 變數3..... : ID1 2.4 3.1 1.2 : ID2 NA 2.5 4.8 : ID3 2.2 5 NA : ID4 1.5 NA 0.9 : .... : 我預計會做基本統計量 : Cluster : Factor analysis : 我的問題是,那些NA該怎麼用該變數的平均數取代 : 因為找到的程式範本都是將缺失值去除 : 沒有找到用平均數取代的 : 謝謝 簡單的寫法: dat = data.frame(V1 = c(2.4,NA,2.2,1.5), V2 = c(3.1,2.5,5,NA), V3 = c(1.2,4.8,NA,0.9)) dat_na = lapply(dat, function(x){ x[is.na(x)] = mean(x, na.rm=T); x}) dat_na = as.data.frame(dat_na) 因為data.frame也是一個list 所以用lapply 對每一個column做取代NA為mean的動作 最後再轉回去變成data.frame 如果有categorical的資料,就要額外把numeric部分抓出來 這時候用plyr的numcolwise會比較快 既然都用了plyr,就可以搭配mapvalues把全部的NA取代成平均值 程式就會變的很漂亮(灑花 library(plyr) dat = data.frame(V1 = c(2.4,NA,2.2,1.5), V2 = c(3.1,2.5,5,NA), V3 = c(1.2,4.8,NA,0.9), V4 = LETTERS[1:4]) dat_na = numcolwise(function(x) mapvalues(x, NA, mean(x, na.rm=T)))(dat) 但是這樣名目資料就黃鶴一去不復返了... 我們就要另外把名目資料抓出來在bind一次了,如下: dat_na = data.frame(numcolwise(function(x) mapvalues(x, NA, mean(x, na.rm=T)))(dat), catcolwise(function(x) x)(dat)) dplyr試做: library(dplyr) namesWorking = names(dat)[sapply(dat, class)=="numeric"] cmd = paste0("plyr:::mapvalues(", namesWorking, ", NA, mean(", namesWorking, ", na.rm=T))") dat_na = mutate_(dat, .dots= setNames(lapply(cmd, lazyeval:::interp), namesWorking)) plyr的方法易讀,dplyr的方法有點tricky,一般R的解法易寫但慢,自己取捨吧QQ 歡迎提供其他寫法XD -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.109.73.190 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1444639198.A.782.html ※ 編輯: celestialgod (140.109.73.190), 10/12/2015 16:55:14

10/12 21:43, , 1F
謝謝大大,不過100組ID,12個變數,要怎麼一次取代所
10/12 21:43, 1F

10/12 21:43, , 2F
有NA?變成該變數的mean? (抓頭...)
10/12 21:43, 2F

10/12 21:46, , 3F
我不就是直接寫全部取代....
10/12 21:46, 3F

10/13 08:32, , 4F
感謝,快來市看看
10/13 08:32, 4F
文章代碼(AID): #1M6t7UU2 (R_Language)
討論串 (同標題文章)
文章代碼(AID): #1M6t7UU2 (R_Language)