簡體   English   中英

遍歷列表時出錯:“ [[-。data.frame`(`* tmp *`,,i,value = c(7L,1L,4L,7L,7L,:新列將留下孔……”)中的錯誤。

[英]Error looping through list: “Error in `[<-.data.frame`(`*tmp*`, , i, value = c(7L, 1L, 4L, 7L, 7L, : new columns would leave holes… ”

我試圖編寫一個遍歷列表的函數,以便僅在數據集的特定列上運行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函數來做到這一點。 對此的任何建議也將不勝感激。

非常感謝!

丹尼

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM