【发布时间】:2018-07-10 01:41:19
【问题描述】:
我正在尝试编写一个循环遍历列表的函数,以便仅在数据集的特定列上运行 kmeans 聚类。当在每组列上运行 kmeans 时,我希望输出是每个观察值的集群成员的矩阵/数据框。
这是一个模拟数据集和我想出的函数(我是 R 新手——对不起,如果它不稳定)
set.seed(123)
mydata <- data.frame(a = rnorm(100,0,1), b = rnorm(100,0,1), c =
rnorm(100,0,1), d = rnorm(100,0,1), e = rnorm(100,0,1))
set.seed(123)
my.kmeans <- function(data,k,...) {
clusters <- data.frame(matrix(nrow = nrow(data), ncol =
length(list(...)))) # set up dataframe for clusters
for(i in list(...)) {
kmeans <- kmeans(data[,i],centers = k)
clusters[,i] <- kmeans$cluster
}
colnames(clusters) <- list(...)
clusters
}
我的问题是:当我只要求它使用连续的列时,这似乎有效,但当我要求它跳过一些列时却不行。例如,以下第一个有效,但第二个无效。知道如何解决这个问题吗?
# works how I want
head(my.kmeans(data = mydata, k = 8, c(1,2), c(2,3), c(1,2,3)))
# doesn't work
head(my.kmeans(data = mydata, k = 8, c(1,2), c(2,3), c(1,2,5)))
另外,我知道人们建议使用 apply 函数并远离 for 循环,但我不知道如何使用 apply 函数来做到这一点。对此的任何建议也将不胜感激。
非常感谢!
丹尼
【问题讨论】:
-
问题出在这部分代码
clusters[,i] <- kmeans$cluster因为i在您的第二种情况下解析为 5 -
非常感谢@SatZ!你能解释一下为什么 i 解析为 5 吗?我该如何解决这个问题?抱歉——我对 R 很陌生。非常感谢!
-
对于任何关注的人(尽管这非常具体,所以我对此表示怀疑),我想我想通了:您必须将“for(i in list(..))”更改为"for(i in 1:length(list(...)))";这样,当您稍后使用 i 子集时,它会正确填写。谢谢@SatZ