Развернуть сетку в R с помощью пасты - PullRequest
1 голос
/ 09 мая 2020

Я пытаюсь проанализировать фрейм данных, используя иерархическую кластеризацию 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 и т.п.?

1 Ответ

1 голос
/ 14 мая 2020

Мы можем создать столбец значений 'p'

tests <- expand.grid(Dists=c("euclidean","maximum","manhattan","canberra","binary",
        "minkowski3", "minkowski4", "minkowski5"),
               DS=c("iris0","iris1","iris2"))

Предположим, у нас есть еще один столбец значений 'p' в 'tests', указанное выше решение можно изменить на

tests$p <- as.list(args(dist))$p # default value
i1 <- grepl("minkowski", tests$Dists)
tests$Dists <- sub("[0-9.]+$", "", tests$Dists)

tests$p[i1] <- rep(3:5, length.out = sum(i1))
Map(function(x, ds, p){       
    dist1 <-  dist(get(ds)[, 1:4], method = x, p = p)          
    ct <- cutree(hclust(dist1), 3)
    acc(table(get(ds)$Species, ct))},
       as.character(tests[[1]]), as.character(tests[[2]]), tests$p )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...