Я пытаюсь проанализировать фрейм данных, используя иерархическую кластеризацию hclust
функция в R.
Я хотел бы передать вектор p
значений, которые я напишу заранее (возможно, что-то вроде c(5/4, 3/2, 7/4, 9/4)
) и иметь возможность указывать их как разные варианты значений p с расстоянием Минковского, когда я использую expand.grid
. В идеале, когда просматривается hyperparams
, было бы также ясно, какое значение p было использовано для каждого minkowski
, т.е. они должны быть помечены. Так, например, где (если вы запустите мой код для hyperparams
) в настоящее время будет только один minkowski
в Dists, для каждого из методов в Meths, если бы я предоставил вектор p
как c(5/4, 3/2, 7/4, 9/4)
, теперь вместо 4 строк для расстояния Минковского: minkowski, p=5/4
, minkowski, p=3/2
, minkowski, p=7/4
, minkowski, p=9/4
(или что-то вроде этого, делая значения p ясными). Есть идеи?
(Примечание: никаких пакетов, только базовый R!)
Изменить: Раньше я плохо сформулировал это, теперь переписан. Вместо этого возьмем следующий пример:
acc <- function(x){
first = sum(x)
second = sum(x^2)
return(list(First=first,Second=second))
}
iris0 <- iris
iris1 <- cbind(log(iris[,1:4]),iris[5])
iris2 <- cbind(sqrt(iris[,1:4]),iris[5])
Теперь важный бит:
tests <- expand.grid(Dists=c("euclidean","maximum","manhattan","canberra","binary"),
DS=c("iris0","iris1","iris2"))
Table <- Map(function(x, ds){acc(table(ds$Species, cutree(hclust(dist(get(ds)[,1:4], method=x)),3)))},tests[[1]], tests[[2]])
Это будет работать. Но теперь, если я хочу включить термин вроде "minkowski",p=3
в expand.grid, как мне это сделать?
tests <- expand.grid(Dists=c("euclidean","maximum","manhattan","canberra","binary","minkowski,p=3"),
DS=c("iris0","iris1","iris2"))
Table <- Map(function(x, ds){acc(table(ds$Species, cutree(hclust(dist(get(ds)[,1:4], method=x)),3)))},tests[[1]], tests[[2]])
Это дает ошибку.
На самом деле не должно быть p
аргумент, если только не method="minkowski"
. Я попытался использовать strsplit
, чтобы получить первую часть выражения в ds, и switch
с strsplit
, чтобы получить вторую часть, а затем использовать parse
(он вернет NULL, если длина strsplit не было 2 - это не должно считаться аргументом, я думаю). Проблема, похоже, в том, что strsplit
не strsplit(x,",")
не может оценить векторизованный x, а скорее пытается оценить символ x
, который не является строкой. Может ли кто-нибудь предложить обходной путь / исправление или другой метод для включения условий minkowski,p=1.6
и т.п.?