我正在使用for循环在R中编写一个简单的函数。该函数采用数据集,在for循环内,循环遍历并为kmeans函数提供不同的簇数值。代码如下:
s_kmeans <- function(fname){
wss = NULL
dataset <- read.csv(file=fname1,header = TRUE, sep = ",")
for(i in 2:10)
{
results <- kmeans(dataset,i)
wss[i] <- results$tot.withinss
}
x <- c(2:10)
df <- data.frame(x,wss)
g <- ggplot(df, aes(x))
g <- g+geom_line(aes(y=wss), color="red")
}
现在,如果我运行此代码,则会出错:
Error in data.frame(x, wss) :
arguments imply differing number of rows: 9, 10
实际上我想要从簇数为2到10的结果。我的理解是循环运行9次,x vector也有9个元素。我修改了代码,如下所示:
s_kmeans <- function(fname){
wss = NULL
dataset <- read.csv(file=fname1,header = TRUE, sep = ",")
for(i in 2:10)
{
results <- kmeans(dataset,i)
wss[i] <- results$tot.withinss
}
x <- c(1:10)
print(wss)
print(x)
df <- data.frame(x,wss)
g <- ggplot(df, aes(x))
g <- g+geom_line(aes(y=wss), color="red")
}
现在它没有给出任何错误,但是将NA作为wss的第一个元素(wss中的总共10个元素,应该是9,因为循环运行9次)向量和x向量。 Out如下所示:
[1] NA 1019.0836 864.0937 655.6397 506.3810 520.0426 374.2550 294.3192 330.9977 316.5263
[1] 1 2 3 4 5 6 7 8 9 10
我不知道发生了什么。任何人都可以请帮助。
答案 0 :(得分:1)
因为你没有为wss [1]设置值,所以它给了你NA。尝试修改你的循环如下
for(i in 1:9)
{
results <- kmeans(dataset,i+1)
wss[i] <- results$tot.withinss
}
x <- c(1:9)
答案 1 :(得分:0)
我认为问题不在于k-means,在定义变量时,维度存在问题。你想要做的是绘制x
与tot.withinss
,即群集数量和总和,并选择最佳数字,这样你就必须做下一个:
s_kmeans <- function(fname){
wss = NULL
dataset <- read.csv(file=fname1,header = TRUE, sep = ",")
for(i in 2:10)
{
results <- kmeans(dataset,i)
wss[(i-1)] <- results$tot.withinss
}
x <- 2:10
print(wss)
print(x)
df <- data.frame(x,wss)
g <- ggplot(df, aes(x))
g <- g+geom_line(aes(y=wss), color="red")
}
看x
从2
开始,wss
将是9维向量,所以你的情节会有
> x
[1] 2 3 4 5 6 7 8 9 10
正方形的总和为tot.withinss
。