问题描述
因此,我尝试在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))