遍历列表时出错:“ [<-。data.frame`(`* tmp *`,,i,value = c(7L,1L,4L,7L,7L,:中的错误:新列会留下孔... “

时间:2018-07-10 01:41:20

标签: r function loops k-means

我试图编写一个遍历列表的函数,以便仅在数据集的特定列上运行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函数来做到这一点。对此的任何建议也将不胜感激。

非常感谢!

丹尼

1 个答案:

答案 0 :(得分:1)

以@SatZ的评论为基础,

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)) 
mylist <- list(c(1,2), c(2,3), c(1,2,5))

set.seed(123)
my.kmeans <- function(data,k,list) {
  clusters <- data.frame(matrix(nrow = nrow(data), ncol = 
                              length(list))) # set up dataframe for 
                              clusters
  for(i in 1:length(list)) {
      kmeans <- kmeans(data[,list[[i]]],centers = k)
      clusters[,i] <- kmeans$cluster
  }
  colnames(clusters) <- list
  clusters
}

head(my.kmeans(data = mydata, k = 8, list = mylist))