List 如何使用R自动创建结构列表?

List 如何使用R自动创建结构列表?,list,r,structure,List,R,Structure,假设RES是一个可以容纳1000个结构的列表,kmeans函数将其作为输出生成 如何声明RES? 在RES声明之后,我想做如下事情: for (i in 1:1000) { RES[i] = kmeans(iris,i) } 多谢各位。 Rui不幸的是,创建列表的方法与通常创建数字向量的方法不同 # The "usual" way to create a numeric vector myNumVec <- numeric(1000) # A numeric vector with

假设RES是一个可以容纳1000个结构的列表,kmeans函数将其作为输出生成

如何声明RES?

在RES声明之后,我想做如下事情:

for (i in 1:1000) {
  RES[i] = kmeans(iris,i)
}
多谢各位。
Rui

不幸的是,创建列表的方法与通常创建数字向量的方法不同

# The "usual" way to create a numeric vector
myNumVec <- numeric(1000) # A numeric vector with 1000 zeroes...

# ...But there is also this way
myNumVec <- vector("numeric", 1000) # A numeric vector with 1000 zeroes...


# ...and that's the only way to create lists:

# Create a list with 1000 NULLs
RES <- vector("list", 1000)
#创建数字向量的“常用”方法

myNumVec如果使用R apply习惯用法,代码将更简单,并且不必事先声明变量:

RES <- lapply(1:3, function(i)kmeans(dist(iris[, -5]),i))

在这种情况下,我认为
lappy
是正确的答案。 但是有很多场景需要循环,这是一个好问题

R列表不需要提前声明为空,因此最简单的方法是将其“声明”
RES
为空列表:

RES <- list()
for (i in 1:1000) {
   RES[i] = kmeans(iris,i)
}

resnice!:)但是,我尝试了RES,因为您尝试在
虹膜上进行聚类,而不是在距离矩阵上进行聚类。阅读
?kmeans
?dist
的帮助。谢谢Andrie。这是因为kmeans。现在,您的解决方案正在发挥作用!我从sapply身上学到了一些重要的东西!在您的示例中,我们知道是“numeric”类型,我不知道kmeans函数输出是什么类型。我猜它类似于“c”中的结构。我怎样才能扭转局面?THanks@Rui
kmeans
的输出是类
kmeans
的对象,本质上与列表相同。所以@Tommy的代码可以工作(除了kmeans需要一个距离矩阵作为输入,而不是data.frame)。@Andrie,我从来没有使用过kmeans和距离矩阵作为输入。我总是使用data.frame。sapply/lapply解决方案非常优雅。感谢you@Tommy,它不起作用。RES[2]=kmeans(iris[,-5],2):要替换的项目数不是替换长度的倍数,这就是我需要此解决方案的原因。这是因为我将使用通过多个内核并行的foreach库。@Rui-oops应该是双括号赋值(
RES[[I]]
)。我更新了代码。
> str(RES)
List of 3
 $ :List of 7
  ..$ cluster     : Named int [1:150] 1 1 1 1 1 1 1 1 1 1 ...
  .. ..- attr(*, "names")= chr [1:150] "1" "2" "3" "4" ...
  ..$ centers     : num [1, 1:150] 2.89 2.93 3.04 2.96 2.93 ...
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : chr "1"
  .. .. ..$ : chr [1:150] "1" "2" "3" "4" ...
  ..$ totss       : num 55479
  ..$ withinss    : num 55479
  ..$ tot.withinss: num 55479
  ..$ betweenss   : num 4.15e-10
  ..$ size        : int 150
  ..- attr(*, "class")= chr "kmeans"
 $ :List of 7
  ..$ cluster     : Named int [1:150] 1 1 1 1 1 1 1 1 1 1 ...
  .. ..- attr(*, "names")= chr [1:150] "1" "2" "3" "4" ...
  ..$ centers     : num [1:2, 1:150] 0.531 4.104 0.647 4.109 0.633 ...
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : chr [1:2] "1" "2"
  .. .. ..$ : chr [1:150] "1" "2" "3" "4" ...
  ..$ totss       : num 55479
  ..$ withinss    : num [1:2] 863 9743
  ..$ tot.withinss: num 10606
  ..$ betweenss   : num 44873
  ..$ size        : int [1:2] 51 99
  ..- attr(*, "class")= chr "kmeans"
 $ :List of 7
  ..$ cluster     : Named int [1:150] 2 2 2 2 2 2 2 2 2 2 ...
  .. ..- attr(*, "names")= chr [1:150] "1" "2" "3" "4" ...
  ..$ centers     : num [1:3, 1:150] 3.464 0.5 5.095 3.438 0.622 ...
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : chr [1:3] "1" "2" "3"
  .. .. ..$ : chr [1:150] "1" "2" "3" "4" ...
  ..$ totss       : num 55479
  ..$ withinss    : num [1:3] 2593 495 1745
  ..$ tot.withinss: num 4833
  ..$ betweenss   : num 50646
  ..$ size        : int [1:3] 62 50 38
  ..- attr(*, "class")= chr "kmeans"
RES <- list()
for (i in 1:1000) {
   RES[i] = kmeans(iris,i)
}
newList <- list()
newList[5] <- 100