在2个列表中的匹配元素上迭代一个函数

问题描述

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

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

每个数据框具有相同的结构:许多行样本和107列变量,但是第一列和第二列只是诸如实际药物治疗之类的数据标签

这里是指向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)中的错误: “中心”的长度必须等于“ x”的列数”

但是,两个列表都有7个元素,我不知道哪里出了问题。

其他问题与.f =参数中的〜有关。我读到,如果我有函数输入,则不需要添加〜,但是,在这种情况下,如果删除〜,则错误提示未找到x。那么为什么在这里需要〜,并且我应该总是将〜放在我放置在map()参数中的函数的前面吗?

解决方法

您应该仅将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,function(a,b) get.knnx(scale(a[,b,500))