Как рассчитать сходство для всех строк в таблице в R? - PullRequest
0 голосов
/ 04 октября 2018

Я хотел бы рассчитать сходство (числовая мера того, насколько похожи 2 объекта данных - в данном случае, насколько похожи 2 строки) каждой строки в таблице, и таблица будет выглядеть так:

vhigh,vhigh,2,2,small,low,unacc
vhigh,vhigh,2,2,small,med,unacc
vhigh,vhigh,2,2,small,high,unacc
vhigh,vhigh,2,2,med,low,unacc
vhigh,vhigh,2,2,med,med,unacc
vhigh,vhigh,2,2,med,high,unacc
vhigh,vhigh,2,2,big,low,unacc
vhigh,vhigh,2,2,big,med,unacc
vhigh,vhigh,2,2,big,high,unacc

Я пробовал много разных способов в интернете, но большинство из них для расчета сходства для матрицы.Очевидно, мы можем легко сказать, что первая и вторая строки «наиболее похожи», потому что они имеют только одну другую переменную, но мне нужен одноразовый способ сравнения каждой строки этой таблицы.

Результат может быть таким: сходство первого и второго ряда составляет 0,983.

1 Ответ

0 голосов
/ 04 октября 2018

Это, по сути, рассчитывает долю элементов, которые одинаковыСначала я создаю фрейм данных:

# Create data frame
data <- read.table(text = "vhigh,vhigh,2,2,small,low,unacc
vhigh,vhigh,2,2,small,med,unacc
           vhigh,vhigh,2,2,small,high,unacc
           vhigh,vhigh,2,2,med,low,unacc
           vhigh,vhigh,2,2,med,med,unacc
           vhigh,vhigh,2,2,med,high,unacc
           vhigh,vhigh,2,2,big,low,unacc
           vhigh,vhigh,2,2,big,med,unacc
           vhigh,vhigh,2,2,big,high,unacc", sep = ",")

Затем я загружаю dplyr.

# Load dplyr library
library(dplyr)

Это функция, которая выполняет всю работу.

# Function for comparing rows
row_cf <- function(x, y, df){
  sum(df[x,] == df[y,])/ncol(df)
}

И здесь это применяется.

# 1) Create all possible row combinations
# 2) Rename the columns for readability
# 3) Run through each row
# 4) Calculate similarity
res <- expand.grid(1:nrow(data), 1:nrow(data)) %>% 
  rename(row_1 = Var1, row_2 = Var2) %>% 
  rowwise() %>% 
  mutate(similarity = row_cf(row_1, row_2, data))

# Results
#    row_1 row_2 similarity
# 1      1     1  1.0000000
# 2      2     1  0.8571429
# 3      3     1  0.7142857
# 4      4     1  0.7142857
# 5      5     1  0.5714286
# 6      6     1  0.5714286
# 7      7     1  0.7142857
# 8      8     1  0.5714286
# 9      9     1  0.5714286
# 10     1     2  0.8571429
# 11     2     2  1.0000000
# 12     3     2  0.7142857
# 13     4     2  0.5714286
# 14     5     2  0.7142857
# 15     6     2  0.5714286
# 16     7     2  0.5714286
# 17     8     2  0.7142857
# 18     9     2  0.5714286
# 19     1     3  0.7142857
# 20     2     3  0.7142857
# 21     3     3  1.0000000
# 22     4     3  0.7142857
# 23     5     3  0.7142857
# 24     6     3  0.8571429
# 25     7     3  0.7142857
# 26     8     3  0.7142857
# 27     9     3  0.8571429
# 28     1     4  0.7142857
# 29     2     4  0.5714286
# 30     3     4  0.7142857
# 31     4     4  1.0000000
# 32     5     4  0.8571429
# 33     6     4  0.8571429
# 34     7     4  0.8571429
# 35     8     4  0.7142857
# 36     9     4  0.7142857
# 37     1     5  0.5714286
# 38     2     5  0.7142857
# 39     3     5  0.7142857
# 40     4     5  0.8571429
# 41     5     5  1.0000000
# 42     6     5  0.8571429
# 43     7     5  0.7142857
# 44     8     5  0.8571429
# 45     9     5  0.7142857
# 46     1     6  0.5714286
# 47     2     6  0.5714286
# 48     3     6  0.8571429
# 49     4     6  0.8571429
# 50     5     6  0.8571429
# 51     6     6  1.0000000
# 52     7     6  0.7142857
# 53     8     6  0.7142857
# 54     9     6  0.8571429
# 55     1     7  0.7142857
# 56     2     7  0.5714286
# 57     3     7  0.7142857
# 58     4     7  0.8571429
# 59     5     7  0.7142857
# 60     6     7  0.7142857
# 61     7     7  1.0000000
# 62     8     7  0.8571429
# 63     9     7  0.8571429
# 64     1     8  0.5714286
# 65     2     8  0.7142857
# 66     3     8  0.7142857
# 67     4     8  0.7142857
# 68     5     8  0.8571429
# 69     6     8  0.7142857
# 70     7     8  0.8571429
# 71     8     8  1.0000000
# 72     9     8  0.8571429
# 73     1     9  0.5714286
# 74     2     9  0.5714286
# 75     3     9  0.8571429
# 76     4     9  0.7142857
# 77     5     9  0.7142857
# 78     6     9  0.8571429
# 79     7     9  0.8571429
# 80     8     9  0.8571429
# 81     9     9  1.0000000
...