我正在尝试创建一个在数据集中的特定列上运行kmeans集群并返回集群成员身份的函数。这个想法是,其他人可能会说“如果我使用x,y和z列,聚类会是什么样子”。
我正在尝试使用以下代码。由于某种原因,当我将magic_result()放入函数中时,它不会返回任何内容。
mydata.test <- data.frame(a = c(1,1,1,2,2,2,3,3,3), b =
c(2,2,2,4,4,4,5,5,5), c = c(1,1,1,6,6,6,4,4,4), d =
c(1,1,1,4,4,4,2,2,2), e = c(14,40,84,14,40,84,14,40,84))
mylist.test <- list(c(1,2),c(2,3),c(1,2,3),c(1,2,5))
magic_free()
my.kmeans.test <- function(myd,myk,myl) {
library(magicfor)
magic_for(print,silent=T)
for(i in myl) {
kmeans <- kmeans(myd[,i],centers=myk,nstart=25)
cl <- kmeans$cluster
print(cl)
}
res <- magic_result()
res.cl <- res$cl
return(res.cl)
}
我不明白的是,当我尝试将其作为for循环(而不是函数)运行时,它可以工作。
library(magicfor)
magic_for(print,silent=T)
for(i in myl) {
kmeans <- kmeans(mydata.test[,i],centers=3,nstart=25)
cl <- kmeans$cluster
print(cl)
}
res <- magic_result()
res.cl <- res$cl
res.cl
我猜测magicfor正在进行一些时髦的事情。任何想法如何解决这个问题?一切都赞赏。
答案 0 :(得分:1)
使用map
中的purrr
,您可以做到
library(purrr)
my.kmeans.test <- function(myd, myk, myl) {
map(myl, function(idx) {
kmeans(myd[, idx], centers=myk, nstart=25)$center
})
}
my.kmeans.test(mydata.test, 3, mylist.test)