У меня есть фрейм данных, df с двумя переменными, как указано ниже. Используя приведенный ниже код, я хочу получить матричный мат.
Этот код отлично работает для unique (df $ V1) = 3, но требует много времени (›10 часов) для операций, где unique (df $ V1) находится в тысячах.
Dataframe
V1 V2
1 60
1 30
1 38
1 46
2 29
2 35
2 13
2 82
3 100
3 72
3 63
3 45
Код:
#Unique V1 values
vec <- unique(df$V1)
#Count <= valies
val <- combn(vec, 2, function(x)
sum(outer(df$V2[df$V1 == x[1]], df$V2[df$V1 == x[2]], `<=`)))
val
#[1] 5 14 13
#Create an empty matrix
mat <- matrix(0,length(vec), length(vec))
#Fill the lower triangle of the matrix.
mat[lower.tri(mat)] <- val
mat
По сути, для V1 = 1 мы хотим сравнить все значения V2 со всеми значениями V2 для V1 = 2 и 3. Повторите то же самое для V1 = 2 и V1 = 3. Другими словами, для данного значения V1 мы хотим увидеть, меньше ли значения в V2, чем значения в V2 для остальных значений в V1. Например, мы сравниваем значения в V2 для V1 = 1 и V1 = 2. Если значение в V2 для V1 = 1 меньше значения в V2 для V1 = 2, то возвращаемое значение равно 1, иначе 0. Например:
For V1=1->
( 60 > 29 : returns 0,
60 > 35 : returns 0,
60 > 13 : returns 0,
60 < 82 : returns 1,
30 > 29 : returns 0,
30 < 35 : returns 1,
30 > 13 : returns 0,
30 < 82 : returns 1,
38 > 29 : returns 0,
38 > 35 : returns 0,
38 > 13 : returns 0,
38 < 82 : returns 1,
46 > 29 : returns 0,
46 > 35 : returns 0,
46 > 13 : returns 0,
30 < 82 : returns 1)=Sum is 5 (i.e. mat[1,2])