我认为我错误地从矩阵中访问和分配变量。我理解R中的数组,矩阵和表是不同的。我想要最终得到的是一个名为" c"有一个1或2分配从输入到Mew(数字1)或Mewtwo(数字2)的元素。我也想要从Mew到数组中所有其他点的距离dMew以及dMewtwo距离的数组从Mewtwo到输入中的所有其他元素。我最终得到的是除输入之外的所有变量的NA_real_。有很多关于访问R中各种数据结构的行或列的很好的信息,但我有兴趣访问单个任何建议都是最有帮助的。如果以前已经回答了这个建议,我很抱歉,但我无法在任何地方找到它。
#Read input from a csv data file
input = read.csv("~/Desktop/Engineering/iris.csv",head=FALSE)
input = input[c(0:3)]
input = as.matrix(input)
#set random centroids
Mew = input[1,1]
Mewtwo = input[nrow(input),ncol(input)]
#Determine Distance
dist <- function(x, y) {
return(sqrt((x - y)^2))
}
#Determine the clusters
dMew = matrix(,nrow(input), ncol(input))
dMewtwo = matrix(,nrow(input), ncol(input))
c = matrix(,nrow(input), ncol(input))
for (i in 1:nrow(input)) {
for (j in 1:ncol(input)) {
dMew[i,j] = dist(Mew, input[i,j])
dMewtwo[i,j] = dist(Mewtwo, input[i,j])
if (dMew[i,j] > dMewtwo[i,j]) {
c[i,j] = 2
} else {
c[i,j] = 1
}
}
}
#Update the centroids
Mew = mean(dMew)
Mewtwo = mean(dMewtwo)
答案 0 :(得分:0)
使用以下输入运行代码没有问题:
input = data.frame(V1=1:5,V2=1:5,V3=1:5)
所以它似乎是与您的数据相关的问题。你也应该避免使用&#34; c&#34;作为变量名称并注意dist()已经是stats包中的一个函数。此外,您可以使用apply()和ifelse()来避免for循环:
#Read input from a csv data file
input = data.frame(V1=1:5,V2=1:5,V3=1:5)
input = input[c(1:3)]
input = as.matrix(input)
#set random centroids
Mew = input[1,1]
Mewtwo = input[nrow(input),ncol(input)]
#Determine Distance
dist.eu <- function(x, y) {
return(sqrt((x - y)^2))
}
dMew<-apply(input,c(1,2),dist.eu,Mew)
dMewtwo<-apply(input,c(1,2),dist.eu,Mewtwo)
c.mat<-ifelse(dMew > dMewtwo,2,1)
c.mat