Я ищу разумный способ определения сходства между членами проектной группы, все из которых были оценены по четырем измерениям.
Здесь ниже добавлена выдержка из данных, а в конце вопроса в dput добавлен пример немного большего размера.
pnum invid dom_st prim_st pat_st net_st
1: 7265873 24104 0 1 1 0
2: 7266757 38775 1 2 2 3
3: 7266757 38776 1 2 2 3
4: 7268524 34281 1 3 2 2
5: 7268524 34282 1 3 2 2
6: 7272620 20002 0 1 2 0
7: 7272620 22284 0 1 2 0
8: 7273253 31921 1 1 1 4
9: 7273253 31922 1 1 1 4
10: 7283628 26841 1 1 1 2
11: 7283628 26843 1 1 1 2
12: 7289442 17763 2 11 48 10
13: 7289442 17764 2 11 63 9
14: 7289525 38087 0 1 1 0
15: 7289525 38088 0 2 1 0
16: 7289525 38089 0 3 1 1
Цель состоит в том, чтобы создать меру сходства для каждого «pnum», которая сравнивает значения четырех последних столбцов во всех «invid». Количество «инвидов» на «пнум» варьируется от 2 до 26.
РЕДАКТИРОВАТЬ 1: Конкретно, для «pnum» 7266757 (строки 2 и 3) я хочу сходства между вектором th для invid 38775 (1,2,2,3) и invid 38776 (1,2,2,3), так что этот должен дать результат 1. Для 'pnum' 7289525 (строки 14-16) мне нужно сходство между тремя векторами-строками (0,1,1,0), (0,2,1,0) и (0,3,1,1). Это дает следующее:
simil(matrix(c(0,1,1,0,0,2,1,0,0,3,1,1), nrow = 3, byrow = TRUE), method = "cosine")
1 2
2 0.9486833
3 0.8528029 0.9438798
На последнем этапе (может быть отдельная формула) я хотел бы «уменьшить» эту матрицу (для команд из n> 2) до одного значения, которое в идеале должно быть ограничено между 0 и 1. Простой способ сделать это будет просто взять среднее значение результата матрицы, но, возможно, есть более разумный способ?
Я попробовал следующее (с данными, хранящимися в data.table 'dt', но это дало следующую ошибку:
library('proxy')
sim <- dt[, simil(dt, method="cosine"), by = pnum]
Error in .Call("R_cosine", c(4262069, 4262069, 4262069, 4273567, 4273567, : negative length vectors are not allowed
Любые предложения по более успешному применению этой или аналогичной функции к data.table и творческие идеи о том, как уменьшить матрицу сходства до одного значения точки, будут очень приветствоваться.
Общий набор данных составляет около 150 000 строк с примерно 92 000 проектов «pnum».
structure(list(pnum = c(7265873, 7266757, 7266757, 7268524, 7268524,
7272620, 7272620, 7273253, 7273253, 7283628, 7283628, 7289442,
7289442, 7289525, 7289525, 7289525, 7301987, 7301987, 7305259,
7305259, 7307986, 7307986, 7310332, 7310332, 7333490, 7333490,
7333502, 7333502, 7414991, 7414991), invid = c(24104, 38775,
38776, 34281, 34282, 20002, 22284, 31921, 31922, 26841, 26843,
17763, 17764, 38087, 38088, 38089, 34843, 38412, 32514, 33946,
28587, 28588, 17204, 17205, 28587, 28588, 28587, 28588, 37008,
37009), dom_st = c(0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 2, 2, 0,
0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0), prim_st = c(1,
2, 2, 3, 3, 1, 1, 1, 1, 1, 1, 11, 11, 1, 2, 3, 3, 3, 1, 1, 5,
5, 3, 3, 5, 5, 5, 5, 3, 3), pat_st = c(1, 2, 2, 2, 2, 2, 2, 1,
1, 1, 1, 48, 63, 1, 1, 1, 1, 1, 1, 1, 5, 5, 14, 14, 5, 5, 5,
5, 1, 1), net_st = c(0, 3, 3, 2, 2, 0, 0, 4, 4, 2, 2, 10, 9,
0, 0, 1, 2, 2, 0, 0, 2, 2, 4, 4, 2, 2, 2, 2, 0, 0)), .Names = c("pnum",
"invid", "dom_st", "prim_st", "pat_st", "net_st"), class = c("data.table",
"data.frame"), row.names = c(NA, -30L), .internal.selfref = <pointer: 0x0000000000230788>)
simil(dt, method="cosine")
, если это допустимый код, будет оценивать один и тот же результат в каждой группеby=
, поскольку вы на самом деле не используете подмножество данных, связанных с ним... - person Frank   schedule 03.05.2017