【问题标题】:R iterate a function over the matching elements in 2 listsR 在 2 个列表中的匹配元素上迭代一个函数
【发布时间】:2020-11-10 04:08:50
【问题描述】:

所以我尝试对列表中的每个元素(数据帧)执行 Kmeans 聚类,从 kmeans 聚类的输出中,我选取了与每个数据帧匹配的“中心”,并将所有中心绑定到另一个列表中。

接下来,我要做的是使用函数 get.knnx(),这样我就可以使用 kmeans 聚类生成的每个中心,然后返回到原始数据帧来采样 500 个最接近的数据点到中心,以实现数据的良好二次抽样。 (我没有使用分配的kmeans集群成员的原因是因为执行kmeans的数据只是原始数据集的子采样用于训练)

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

这是指向 2 个示例数据的链接 https://drive.google.com/drive/folders/1B8JQY94Z-BHTZEKlV4dvUDocmiyppBDa?usp=sharing

library(tidyverse)
library(purr)
#take data into list
mylist <- list(df1,df2,df3...)

#perform Kmeans cluster
#scale datainput and drop the data label column
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"))

#Isolate the Centers info to another list
 Kmeans_centers <- map(Kmeans.list, ~.x$centers)

#trying to use map2
y <- map2(.x = mylist,.y=Kmeans_centers,
     .f=~get.knnx(scale(.x[,-c(1:2)],.y, 500)))

感谢 Stackoverflow 上的传奇人物的帮助,我设法让 kmeans 工作并获得了中心列表。现在我想用同样的逻辑来使用map2()

现在我从 map2 得到的错误是“Scale.default(.x[, -c(1:2)], .y, 500) 中的错误: 'center' 的长度必须等于 'x' 的列数”

但是,两个列表都有 7 个元素,我不太清楚出了什么问题。

其他问题是关于 .f= 参数中的 ~。我读到如果我有一个函数输入,我不需要添加〜,但是,在这种情况下,如果我删除〜,错误说x not found。那么为什么这里需要 ~,我应该总是把 ~ 放在我放在 map() 参数中的函数前面吗?

【问题讨论】:

    标签: r list knn map-function


    【解决方案1】:

    您应该仅将scale 函数应用于数据框。

    library(purrr)
    library(FNN)
    
    map2(.x = mylist,.y=Kmeans_centers, .f=~get.knnx(scale(.x[,-c(1:2)]),.y, 500))
    

    ~ 是一种基于公式的语法,用于应用函数,其中第一个参数称为.x,第二个参数称为.y。它是使用匿名函数的替代方法,可以写成

    map2(.x = mylist,.y=Kmeans_centers, function(a, b) get.knnx(scale(a[,-c(1:2)]),b, 500))
    

    【讨论】:

    • 谢谢!天哪,我不敢相信这是一个愚蠢的错字让我烦恼。哈哈。谢谢你的解释。现在我明白了很多。有时我对文档的解释是错误的。
    猜你喜欢
    • 2020-05-15
    • 2014-03-12
    • 2021-11-12
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2015-08-06
    • 1970-01-01
    相关资源
    最近更新 更多