Как перекодировать значения в матрицу на основе расчета?

У меня вопрос. Я работаю над созданием системы рекомендаций в 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

Надеюсь, это полезно

Другие вопросы по тегам