Почему вы хотите изобрести велосипед?В R есть несколько функций / пакетов, которые рассчитают это для вас, в том числе daisy()
в кластере пакетов, который поставляется с R.
Прежде всего, сначала извлеките эти заголовки «типа данных» из ваших данных.Если это действительно матрица, то символьная информация в этой строке заголовка сделает всю матрицу символьной матрицей.Если это фрейм данных, то все столбцы, вероятно, будут факторами.То, что вы хотите сделать, это кодировать тип данных в каждом столбце (компоненте вашего фрейма данных) как 'factor'
или 'ordered'
.
df <- data.frame(A = c("ordinal",1:3), B = c("nominal","A","B","A"),
C = c("nominal",1,2,1))
. Это означает, что все они сохраняются.как факторы из-за дополнительной информации.
> head(df)
A B C
1 ordinal nominal nominal
2 1 A 1
3 2 B 2
4 3 A 1
> str(df)
'data.frame': 4 obs. of 3 variables:
$ A: Factor w/ 4 levels "1","2","3","ordinal": 4 1 2 3
$ B: Factor w/ 3 levels "A","B","nominal": 3 1 2 1
$ C: Factor w/ 3 levels "1","2","nominal": 3 1 2 1
Если мы избавимся от первой строки и перекодируем в правильные типы, мы сможем легко вычислить коэффициент Гауэра.
> headers <- df[1,]
> df <- df[-1,]
> DF <- transform(df, A = ordered(A), B = factor(B), C = factor(C))
> ## We've previously shown you how to do this (above line) for lots of columns!
> str(DF)
'data.frame': 3 obs. of 3 variables:
$ A: Ord.factor w/ 3 levels "1"<"2"<"3": 1 2 3
$ B: Factor w/ 2 levels "A","B": 1 2 1
$ C: Factor w/ 2 levels "1","2": 1 2 1
> require(cluster)
> daisy(DF)
Dissimilarities :
2 3
3 0.8333333
4 0.3333333 0.8333333
Metric : mixed ; Types = O, N, N
Number of objects : 3
Что даетто же самое, что gower.dist()
для этих данных (хотя в несколько ином формате (as.matrix(daisy(DF))
) будет эквивалентно):
> gower.dist(DF)
[,1] [,2] [,3]
[1,] 0.0000000 0.8333333 0.3333333
[2,] 0.8333333 0.0000000 0.8333333
[3,] 0.3333333 0.8333333 0.0000000
Вы говорите, что не можете сделать это таким образом?Можете ли вы объяснить, почему нет?Поскольку вы, похоже, будете прилагать определенные усилия, чтобы сделать что-то, что другие люди уже закодировали для вас.Это не домашняя работа, не так ли?