Как посчитать общий объект символов в R - PullRequest
0 голосов
/ 05 августа 2020

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

У меня есть матрица, а столбец 1 - это названия брендов, скажем «A», «B» и «C» (их 1212), а столбец 2 - это тип кода. это 4 цифры, и у каждой марки есть только одна из них, но это не обязательно.

> data3
      [,1] [,2]  
 [1,] "A"  "A012"
 [2,] "A"  "A001"
 [3,] "A"  "A123"
 [4,] "A"  "A005"
 [5,] "A"  "A004"
 [6,] "A"  "A100"
 [7,] "A"  "A023"
 [8,] "A"  "A055"
 [9,] "A"  "A044"
[10,] "A"  "A101"
[11,] "B"  "A012"
[12,] "B"  "A123"
[13,] "B"  "A005"
[14,] "B"  "A055"
[15,] "B"  "A044"
[16,] "B"  "A101"
[17,] "C"  "A032"
[18,] "C"  "A001"
[19,] "C"  "A323"
[20,] "C"  "A003"
[21,] "C"  "A011"
[22,] "C"  "A111"
[23,] "C"  "A013"
[24,] "C"  "A015"
[25,] "C"  "A014"
[26,] "C"  "A009"
[27,] "C"  "A011"
[28,] "C"  "A073"
[29,] "C"  "A063"
[30,] "C"  "A030"
[31,] "C"  "A028"
[32,] "C"  "A007"

Сколько кодов является общим для A и B? то же самое для "A" и "C". Это простой пример, который я могу сосчитать вручную, но поскольку в реальном примере он становится беспорядочным, и мне нужно понять, как считать. Моя конечная цель - вычислить такое число, как sim (A, B) = \ frac {n (A \ cap B)} {(n (A) + n (B) -n (A \ cap B))} то же самое для sim (A, C).

Сначала я думал преобразовать второй столбец в число, отбросив «A», например

 [1,] "A"  12
 [2,] "A"  1
 [3,] "A"  123
 [4,] "A"  5
 [5,] "A"  4

, а затем используя | и другой объект logi c, но мне не удалось преобразовать символ в число.

1 Ответ

0 голосов
/ 05 августа 2020

Для этого можно использовать оператор %in% вместе с sum(). Но сначала вам нужно немного преобразовать данные.

Преобразовать матрицу в фрейм данных

# Convert to data frame. 
# Colnames will be set to "V1" (your column 1) and "V2" (your column 2) automatically
d <- as.data.frame(data3) 

# Filter data and extract variable
col2A <- d[d$V1 == "A", 2]
col2B <- d[d$V1 == "B", 2]

Получить количество общих значений

# check element-wise if value from col2A is in col2B
col2A %in% col2B
# Output: [1] FALSE FALSE  TRUE  TRUE FALSE (...)

# get number of common values 
sum(col2A %in% col2B)
...