我想通过对应于考虑其他2个变量X1和X2计算的每个聚类的平均值来估算变量x3。 我知道你可以通过一个函数来传递来自Hmisc包的函数,比如“mean”,它可以完成工作。所以我想传递一个完成以下所有操作的函数。
我用来编写代码来执行此操作:
df1 <- data.frame(x1=runif(1000,0,100),
x2=runif(1000,0,100),
x3=c(runif(900,0,100),rep(NA,100)))
我想传递一个完成所有这一切的功能:
clust<-kmeans(df1[,-grep('x3', colnames(df1))], 3)
df1$clust<-clust$cluster
library(plyr)
cc<-ddply(df1, 'clust',summarise, mean=mean(x3, na.rm=TRUE))
df2<-merge(df1,cc, by='clust')
df2$x3imputed2<-ifelse(is.na(df2$x3),df2$mean, df2$x3)
有没有办法将所有这些代码作为函数传递并在Hmisc中使用它? (我有一个问题,ddply将x3作为变量引入)。
如下所示:
ff<-function(i) {
clust<-kmeans(df1[,-grep(i, colnames(df1))], 3)
df1$clust<-clust$cluster
cc<-aggregate(df1[,i], by=list(clust=df1$clust), "mean", na.rm=TRUE)
df2<-merge(df1,cc, by='clust')
df2$x3imputed2<-ifelse(is.na(df2[, i]),df2$x, df2[,i])
}
f1$imputedx3<-with(df1, impute(x3,ff))
但是我收到了一个错误:
空集群:尝试一组更好的初始中心
当我用x3替换它时,我没有得到同样的错误。
答案 0 :(得分:4)
尝试
f2 <- function(dat, cname){
nm1 <- match.call()[[3]]
nm2 <- paste0(nm1, 'imputed')
indx <- grep(nm1, colnames(dat))
clust <- kmeans(dat[,-indx],3)$cluster
dat %>%
group_by(clust=clust) %>%
mutate_(interp(~ifelse(is.na(v), mean(v, na.rm=TRUE), v),
v= lazy(cname))) %>%
setNames(., c(head(names(.),-1), nm2))
}
f2(df1, x3)
或者您可以使用browser.get()
sources