Re: [問題] 遺失值的問題
※ 引述《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
10/12 21:43, 1F
→
10/12 21:43, , 2F
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
討論串 (同標題文章)