嗨,我有几个数据帧,每个数据帧代表接受某种处理的样本,我已经将它们组合到一个列表中,想法是我想在列表中的每个元素/数据帧上测试Kmeans聚类方法。
假设我将这7个数据帧绑定到一个列表中。以下是其中两个示例数据https://drive.google.com/drive/folders/1B8JQY94Z-BHTZEKlV4dvUDocmiyppBDa?usp=sharing
每个数据帧具有相同的结构:多行样本和107列变量,但第一列和第二列只是数据标签,例如实际的药物治疗。
我想对这些数据帧中的每一个执行Kmeans聚类,希望从它们中找到具有代表性的样本进行下游处理。
因此,我构建了一个名为Kmeans.list的输出列表来存储结果。我把这个放到循环中是正确的吗?具体地说,这是为了获取列表中的第i个数据帧,并且只获取实际的数值变量列,然后mylist[i] ()将其用于k均值聚类。
我没有成功测试的原因是我对输出也感到困惑。kmeans()函数输出一个列表,我对这个列表特别感兴趣的是“center”。我只想将每个中心的结果存储到一个列表中,这样我就可以向下迭代其他东西。这是可能的吗,或者我必须将所有的kmeans输出存储到这个列表中,然后以某种方式取出中心并绑定它们。
无论哪种方式,我都必须能够使用唯一的名称来存储每个kmeans输出,这样我才能区分它们。如何确保输出列表中的每个元素都以输入数据帧命名?如名称<-Kmeans.list1为df1,依此类推
mylist <- list(df1,df2,df3...)
#kmeans this in a loop
#store output in a list
Kmeans.list <- list()
for (i in length(mylist)) {
Kmeans.list[i] <- kmeans(scale(mylist[[i]][,-c(1:2)]),centers =15,nstart=50,iter.max = 100)
}发布于 2020-11-06 16:55:30
使用tidyverse
如果我没理解错的话
library(FNN)
library(tidyverse)
Kmeans.list <- map(.x = mylist,
.f = ~kmeans(scale(.x[,-c(1:2)]),
centers =15,
nstart=50,
iter.max = 100)) %>%
purrr::set_names(c("df1", "df2"))
Kmeans_centers <- map(Kmeans.list, ~.x$centers)
n500 <- map2(
.x = mylist,
.y = Kmeans_centers,
.f = ~ get.knnx(data = scale(.x[, -c(1:2)]), query = .y, k = 500)) %>%
purrr::set_names(c("df1", "df2"))https://stackoverflow.com/questions/64708720
复制相似问题