R-Hmisc通过聚类结果进行推算

时间:2015-07-26 20:13:39

标签: r replace hmisc

我想通过对应于考虑其他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替换它时,我没有得到同样的错误。

1 个答案:

答案 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