【问题标题】: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在 R 中,在数据帧列表上迭代一个函数,然后将输出存储到一个列表中,每个输出元素由输入数据帧命名
【发布时间】:2021-02-18 20:08:00
【问题描述】:

您好,我有几个数据框,每个数据框代表接受某种处理的样本,我将它们组合成一个列表,我的想法是我想在列表中的每个元素/数据框上测试 Kmeans 聚类方法。

假设我将这 7 个数据帧绑定到一个列表中。 以下是其中 2 个作为示例数据 https://drive.google.com/drive/folders/1B8JQY94Z-BHTZEKlV4dvUDocmiyppBDa?usp=sharing

每个数据框都有相同的结构:多行样本和 107 列变量,但第 1 列和第 2 列只是数据标签,例如实际药物治疗。

我想对这些数据帧中的每一个进行 Kmeans 聚类,希望从中找到有代表性的样本用于下游处理。

所以我构建了一个名为 Kmeans.list 的输出列表来存储结果。我将其放入循环中是否正确?特别是 mylist[[i]][,-c(1:2)],它的目的是获取该列表中的第 i 个数据帧,并且只获取实际的数值变量列,然后 scale() 将其用于 kmeans 聚类。

我没有成功测试的原因是我也对输出感到困惑。 kmeans() 函数输出一个列表,我对其中的“中心”特别感兴趣。我真的只想将每个中心结果存储到一个列表中,这样我就可以在下游迭代其他内容。这可能吗,或者我必须将所有 kmeans 输出存储到此列表中,然后以某种方式取出中心并绑定它们。

无论哪种方式,我都必须能够以唯一的名称存储每个 kmeans 输出,以便将它们区分开来。如何确保输出列表中的每个元素都以输入数据框命名?就像在名称中一样

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)

}

【问题讨论】:

    标签: r list for-loop k-means


    【解决方案1】:

    使用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"))
    

    【讨论】:

    • 嗨@Yuriy Saraykin,这太棒了!输出正是我想要的。我测试了我的方法,输出列表为空。但是您的方法正确存储了集群函数输出中的所有信息,每个元素的名称都很好。现在我可以贪婪地问我如何从每个输出元素中获取“中心”并将它们绑定到一个列表中,每个列表都带有它们来自哪里的名称,例如 df1 df2。
    • 嗨@ML33M,试试这个Kmeans_centers &lt;- map(Kmeans.list, ~.x$centers)
    • 这行得通。我可以贪心多问一块吗?由于现在我有数据 mylist 的列表,以及相应的 kmeans 中心 Kmeans_centers,我想使用函数 get.knnx 以便我可以使用每个 df 的中心来找到靠近我的中心的 500 个数据点。 y
    • 试试这个n500 &lt;- map2( .x = mylist, .y = Kmeans_centers, .f = ~ get.knnx(data = scale(.x[, -c(1:2)]), query = .y, k = 500)) %&gt;% purrr::set_names(c("df1", "df2"))
    • 很高兴能帮上忙!
    猜你喜欢
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多