可以说,RES是一个容量为1000个结构的列表,kmeans可以生成输出结果。如何使用R自动创建结构列表?
我该如何声明RES?
有RES后宣布我想要做这样的事情:
for (i in 1:1000) {
RES[i] = kmeans(iris,i)
}
谢谢。 Rui
可以说,RES是一个容量为1000个结构的列表,kmeans可以生成输出结果。如何使用R自动创建结构列表?
我该如何声明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)
所以,你的例子会成为,
RES <- vector("list", 1000)
for (i in 1:1000) {
RES[[i]] = kmeans(iris,i)
}
(请注意,k均值不喜欢与虹膜数据直接设置一样,虽然被称为...)
但随后再次,lapply
也会这样做,并且以@Andrie所示的更直接的方式。
如果您使用R适用成语,你的代码会更简单,你不必声明您的变量提前:
RES <- lapply(1:3, function(i)kmeans(dist(iris[, -5]),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"
我会其次lapply
在这种情况下是正确的答案。 但有很多情况下需要循环,这是一个很好的问题。
R里面,列表不需要被声明为空的时间提前,所以最简单的方式做到这一点会只是“声明” RES
为空列表:
RES <- list()
for (i in 1:1000) {
RES[i] = kmeans(iris,i)
}
R将只延长列表为每个迭代。
顺便提及,这个工程即使对于非顺序索引:
newList <- list()
newList[5] <- 100
产生具有狭槽1至4设计为NULL和第五时隙100的数量的列表。
这只是说,列表是非常在R比不同的野兽比原子载体。
谢谢大家!它以几种方式工作:) – Rui
在你的例子中,我们知道这是类型“数字” 我不知道什么类型是kmeans函数输出。我想这是类似于“C”中的结构。我该如何解决这个问题? THanks – Rui
@Rui'kmeans'的输出是类“kmeans”的一个对象,它基本上与列表相同。所以@Tmymy的代码将起作用(除了kmeans需要一个距离矩阵作为输入,而不是data.frame)。 – Andrie
@ Andrie,我从来没有用距离矩阵作为输入的kmeans。我总是使用一个data.frame。 sapply/lapply解决方案非常优雅。谢谢 – Rui