[英]Annotation_logticks() Error. Error in `$<-.data.frame`(`*tmp*`, "PANEL", value = c(1L, 8L, 7L, 6L, : replacement has 41 rows, data has 1
[英]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.