【发布时间】:2021-06-26 10:42:16
【问题描述】:
我正在为多个number of clusters 运行kmeans,然后尝试将cluster results 组合 到original dataframe。
来自https://stats.stackexchange.com/questions/10838/produce-a-list-of-variable-name-in-a-for-loop-then-assign-values-to-the 的帖子我正在使用他们下面提到的代码来动态创建变量并根据我的需要进行修改。
上述帖子中的原始代码:
x <- as.list(rnorm(10000))
names(x) <- paste("a", 1:length(x), sep = "")
list2env(x , envir = .GlobalEnv)
现在将其应用于 iris 数据:
library(tidyverse)
library(ggthemes)
library(factoextra)
这在创建 3 个集群列表时效果很好:
# running for 1 to 3 clusters
lapply(1:3,
function(cluster_num){
cluster_res_list <- as.list(kmeans(iris %>% select(-Species), cluster_num, nstart = 25))
names(cluster_res_list) <- paste("iris_clus", 1:length(cluster_res_list), sep="_")
list2env(cluster_res_list, envir = .GlobalEnv)
# iris_df <- cbind(iris, cluster_res_list)
} )
问题:当我尝试将它们与原始数据集结合时出现错误:Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : cannot coerce class ‘"kmeans"’ to a data.frame
lapply(1:3,
function(cluster_num){
cluster_res_list <- as.list(kmeans(iris %>% select(-Species), cluster_num, nstart = 25))
names(cluster_res_list) <- paste("iris_clus", 1:length(cluster_res_list), sep="_")
list2env(cluster_res_list, envir = .GlobalEnv)
# to combine each cluster result to original df
iris_df <- cbind(iris, cluster_res_list)
} )
【问题讨论】:
-
broom包提供了一些将模型输出转换为整齐数据帧的功能。示例:kmeans(iris %>% select(-Species), 3, nstart = 25) %>% broom::tidy()。我不确定您需要哪种数据框,但我希望这会有所帮助。 -
@Damian 我只想将 kmeans 集群的结果结合到原始数据帧中。我也试过
iris_df <- cbind(iris, paste0("iris_clus_", cluster_num)),但这也没有用。一定会检查扫帚。
标签: r dataframe apply lapply k-means