【问题标题】:Error looping through list: "Error in `[<-.data.frame`(`*tmp*`, , i, value = c(7L, 1L, 4L, 7L, 7L, : new columns would leave holes... "循环遍历列表时出错:“`[<-.data.frame`(`*tmp*`, , i, value = c(7L, 1L, 4L, 7L, 7L, : 新列会留下漏洞... "
【发布时间】: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] &lt;- kmeans$cluster 因为 i 在您的第二种情况下解析为 5
  • 非常感谢@SatZ!你能解释一下为什么 i 解析为 5 吗?我该如何解决这个问题?抱歉——我对 R 很陌生。非常感谢!
  • 对于任何关注的人(尽管这非常具体,所以我对此表示怀疑),我想我想通了:您必须将“for(i in list(..))”更改为"for(i in 1:length(list(...)))";这样,当您稍后使用 i 子集时,它会正确填写。谢谢@SatZ

标签: r function loops k-means


【解决方案1】:

以@SatZ 的 cmets 为基础,

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))

【讨论】:

猜你喜欢
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
相关资源
最近更新 更多