在R中映射数据集名称

在R中映射数据集名称,r,combinations,apply,R,Combinations,Apply,我试图用聚类分析来分析iris数据帧。这里提供了一种在R中使用Map将数据映射到expand.grid列出的超参数组合集的方法,并将所有结果收集到一个表中 我现在想同时对数据帧的修改版本执行此操作。例如: acc <- function(x){ first = sum(x) second = sum(x^2) return(list(First=first,Second=second)) } tests <- expand.grid(Clustering_Algorith

我试图用聚类分析来分析
iris
数据帧。这里提供了一种在R中使用
Map
将数据映射到
expand.grid
列出的超参数组合集的方法,并将所有结果收集到一个表中

我现在想同时对数据帧的修改版本执行此操作。例如:

acc <- function(x){
  first = sum(x)
  second = sum(x^2)
  return(list(First=first,Second=second))
}
tests <- expand.grid(Clustering_Algorithm=c("ward.D","ward.D2","single","complete","average","mcquitty","median","centroid"),
                     DS=c("iris0","iris1","iris2"))
iris0 <- iris
iris1 <- cbind(log(iris[,1:4]),iris[5])
iris2 <- cbind(sqrt(iris[,1:4]),iris[5])
Table <- Map(function(x, ds){acc(table(ds$Species, cutree(hclust(dist(ds.[,1:4]),method=x),3)))},tests[[1]], tests[[2]])

acc问题是'ds'是一个字符串,我们需要使用
mget
get

Map(function(x, ds){
    acc(table(get(ds)$Species, cutree(hclust(dist(get(ds)[,1:4]),method=x),3)))
          }, as.character(tests[[1]]), as.character(tests[[2]]))
Map(function(x, ds) {
      acc(table(ds$Species, cutree(hclust(dist(ds[, 1:4]), method = x), 3)))
   }, as.character(tests[[1]]), mget(as.character(tests[[2]])))
#$ward.D
#$ward.D$First
#[1] 150

#$ward.D$Second
#[1] 6492


#$ward.D2
#$ward.D2$First
#[1] 150

#$ward.D2$Second
#[1] 6352
#....

如果我们使用
mget

Map(function(x, ds){
    acc(table(get(ds)$Species, cutree(hclust(dist(get(ds)[,1:4]),method=x),3)))
          }, as.character(tests[[1]]), as.character(tests[[2]]))
Map(function(x, ds) {
      acc(table(ds$Species, cutree(hclust(dist(ds[, 1:4]), method = x), 3)))
   }, as.character(tests[[1]]), mget(as.character(tests[[2]])))
#$ward.D
#$ward.D$First
#[1] 150

#$ward.D$Second
#[1] 6492


#$ward.D2
#$ward.D2$First
#[1] 150

#$ward.D2$Second
#[1] 6352
#....

如果我们想用具有列索引子集的字符串来更改“tests”,而不是
mget
使用
eval(parse

tests <- tests[1:4, ] # subset the first four rows
tests$DS <- c("iris0[,1:4]","iris1[,1:3]","iris2[,2:4]", "iris0[, 1:3]")

Map(function(x, ds) {
   ds1 <- eval(parse(text = ds))
   sp <- get(sub("\\s*\\[.*", "", ds))$Species
  acc(table(sp, cutree(hclust(dist(ds1), method = x), 3))) 
   }, as.character(tests[[1]]), as.character(tests[[2]]))

测试您正在调用的
ds.
虽然它是
ds
,而且它是一个字符串(转换为字符)。谢谢,当然这对我很有帮助(如您所见)--所以我对它进行了升级。但我仍然希望它能够保留hyperparams中的行名称和acc中的列名称,而不必稍后重新插入。我想它会使用unlist()然后在超参数行上应用,或者类似的东西,因为我认为unlist至少与expand.grid结合在一起很常见,而apply是for循环的更好选择。(对于其他人,这是参考我前面的问题)@MobeusZoom如果'DS'列包含“iris0[,1:4]”之类的元素,那么可以执行
eval(parse(text=“iris0[,1:4]”)
@MobeusZoom已更新。如果每个数据集中的“物种”列不同,您可能希望该列的另一个向量也作为
映射的参数,然后使用
get(sub(“\\s*\[.*”,ds))[[nm1]
其中
函数(x,ds,nm1)
Map
的参数将是
as.character(测试[[1]])、as.character(测试[[2]])、vecofspeciescolnames
谢谢!!你甚至想到了进一步的推广,我相信这也会很有帮助。现在,基本上,不同数据集的聚类结果可以以矢量化的方式存储。主要感谢你:)