如何根据计算重新编码矩阵中的值?

How to recode values in a matrix based on a calculation?

我有一个问题。我正致力于在 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 的总数)。

我也在使用数据 Table 包,如果这样更容易的话。

提前致谢!

举个例子

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

希望对您有所帮助

我们可以将数据框与值相乘。

所有为 0 的数字将保持为 0,而为 1 的数字将更改为所需的输出

df[-1] * 1/sqrt(rowSums(df==1))

我们可以在.SDcols中指定感兴趣的列(-1意味着我们选择了除第一列以外的所有列),得到[=20=的子集中每一行的总和] 与 Reduce+,取平方根 (sqrt),除以 1,乘以 data.table 的子集 (.SD) 并赋值 ( :=) 它到感兴趣的列

dt[, (2:ncol(dt)) := .SD*1/sqrt(Reduce(`+`, .SD)), .SDcols = -1]