Пользовательская функция не возвращает результаты цикла for из magicfor
Я пытаюсь создать функцию, которая запускает кластеризацию 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
Я предполагаю, что с магией происходит нечто странное. Есть идеи как обойти это? Все ценится.
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)