作者celestialgod (天)
看板R_Language
标题Re: [问题] 遗失值的问题
时间Mon Oct 12 16:39:55 2015
※ 引述《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://webptt.com/cn.aspx?n=bbs/R_Language/M.1444639198.A.782.html
※ 编辑: celestialgod (140.109.73.190), 10/12/2015 16:55:14
1F:推 morefunmba: 谢谢大大,不过100组ID,12个变数,要怎麽一次取代所 10/12 21:43
2F:→ morefunmba: 有NA?变成该变数的mean? (抓头...) 10/12 21:43
3F:→ celestialgod: 我不就是直接写全部取代.... 10/12 21:46
4F:推 morefunmba: 感谢,快来市看看 10/13 08:32