Как перекодировать значения в матрицу на основе расчета?
У меня вопрос. Я работаю над созданием системы рекомендаций в R, и я довольно плохо знаком с языком. Я не могу понять следующее.
У меня есть матрица, как:
eventID g_26 g_27 g_28 g_29 g_30 g_31 g_32 g_33 g_34 g_35 g_36 g_37 g_38 g_39 g_40 g_41 g_42 g_43
1: 1010 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0
2: 1016 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
3: 1019 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
4: 1053 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
5: 1168 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0
6: 1188 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Что я хотел бы сделать, это заменить все значения, которые имеют от 1 до 1/sqrt(общее количество из 1 в этой конкретной строке).
Я также использую пакет Data Table, если это облегчает.
Заранее спасибо!
3 ответа
Мы можем указать интересующие колонки в .SDcols
(-1
подразумевает, что мы выбрали все столбцы, кроме первого), получим сумму каждой строки в Подмножестве Data.table с помощью Reduce
а также +
возьми квадратный корень (sqrt
), разделите на 1, умножьте на Подмножество data.table (.SD
) и назначить (:=
) это к интересующим колонкам
dt[, (2:ncol(dt)) := .SD*1/sqrt(Reduce(`+`, .SD)), .SDcols = -1]
Мы можем умножить фрейм данных на значение.
Все числа, которые равны 0, останутся 0, а число с 1 будет заменено на желаемый результат
df[-1] * 1/sqrt(rowSums(df==1))
В качестве примера
m <- matrix(c(1, 1, 0, 1, 0, 0, 1, 0, 0), ncol = 3, byrow = T)
rs <- apply(m,1,sum)
rs <- sqrt(rs)
m <- m/rs
Надеюсь, это полезно