在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
谢谢!!你甚至想到了进一步的推广,我相信这也会很有帮助。现在,基本上,不同数据集的聚类结果可以以矢量化的方式存储。主要感谢你:)