在 R 中,在数据帧列表上迭代一个函数,然后将输出存储到一个列表中,每个输出元素由输入数据帧命名
In R iterate a function over a list of dataframes then store the output into a list with each output element named by input data frame
你好,我有几个数据帧,每个数据帧代表接受一种处理的样本,我将它们组合成一个列表,我的想法是我想在列表中的每个 element/dataframe 上测试 Kmeans 聚类方法。
假设我将这 7 个数据帧绑定到一个列表中。
这里有 2 个作为示例数据
https://drive.google.com/drive/folders/1B8JQY94Z-BHTZEKlV4dvUDocmiyppBDa?usp=sharing
每个dataframe的结构都是一样的:很多行样本,107列变量,但是第一列和第二列只是数据标签,比如实际的药物治疗。
我想对这些数据帧中的每一个进行Kmeans聚类,希望从中找到具有代表性的样本进行下游处理。
所以我构建了一个名为 Kmeans.list 的输出列表来存储结果。我把它放在循环中是否正确?特别是 mylist[[i]][-c(1:2)],这是为了获取该列表中的第 i 个数据帧,并且只获取实际的数字变量列,然后对其进行 scale() 以进行 kmeans 聚类。
我没有成功测试的原因是我也对输出感到困惑。 kmeans() 函数输出一个列表,我对其中的“中心”特别感兴趣。我真的只想将每个中心结果存储到一个列表中,这样我就可以在下游迭代其他内容。这可能吗,或者我必须将所有 kmeans 输出存储到这个列表中,然后以某种方式取出中心并绑定它们。
无论哪种方式,我都必须能够用唯一的名称存储每个 kmeans 输出,这样我才能区分它们。如何确保输出列表中的每个元素都以输入数据框命名?就像名字 <-Kmeans.list[1] 是 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)
}
使用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"))
你好,我有几个数据帧,每个数据帧代表接受一种处理的样本,我将它们组合成一个列表,我的想法是我想在列表中的每个 element/dataframe 上测试 Kmeans 聚类方法。
假设我将这 7 个数据帧绑定到一个列表中。 这里有 2 个作为示例数据 https://drive.google.com/drive/folders/1B8JQY94Z-BHTZEKlV4dvUDocmiyppBDa?usp=sharing
每个dataframe的结构都是一样的:很多行样本,107列变量,但是第一列和第二列只是数据标签,比如实际的药物治疗。
我想对这些数据帧中的每一个进行Kmeans聚类,希望从中找到具有代表性的样本进行下游处理。
所以我构建了一个名为 Kmeans.list 的输出列表来存储结果。我把它放在循环中是否正确?特别是 mylist[[i]][-c(1:2)],这是为了获取该列表中的第 i 个数据帧,并且只获取实际的数字变量列,然后对其进行 scale() 以进行 kmeans 聚类。
我没有成功测试的原因是我也对输出感到困惑。 kmeans() 函数输出一个列表,我对其中的“中心”特别感兴趣。我真的只想将每个中心结果存储到一个列表中,这样我就可以在下游迭代其他内容。这可能吗,或者我必须将所有 kmeans 输出存储到这个列表中,然后以某种方式取出中心并绑定它们。
无论哪种方式,我都必须能够用唯一的名称存储每个 kmeans 输出,这样我才能区分它们。如何确保输出列表中的每个元素都以输入数据框命名?就像名字 <-Kmeans.list[1] 是 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)
}
使用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"))