1

我有个问题。我正在用 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 包,如果这样更容易的话。

提前致谢!

4

3 回答 3

1

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

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

df[-1] * 1/sqrt(rowSums(df==1))
于 2017-01-13T12:06:10.520 回答
0

举个例子

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

希望这会有所帮助

于 2017-01-13T12:05:22.737 回答
0

我们可以指定感兴趣的列.SDcols(意味着我们选择了除第一列之外的所有列),用and-1得到 Data.table 的子集中每一行的总和,取平方根 ( ),除以 1,乘以data.table ( ) 的子集并将其分配 ( ) 到感兴趣的列Reduce+sqrt.SD:=

dt[, (2:ncol(dt)) := .SD*1/sqrt(Reduce(`+`, .SD)), .SDcols = -1]
于 2017-01-13T12:06:29.377 回答