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

时间:2017-01-13 11:48:01

标签: r data.table calculation recode

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

我正在使用数据表包,如果这样可以更容易。

提前致谢!

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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

希望有用

答案 2 :(得分:0)

我们可以在.SDcols中指定感兴趣的列(-1表示我们选择了除第一列之外的所有列),使用{{获取Data.table子集中每行的总和1}}和Reduce,取平方根(+),除以1,乘以data.table(sqrt)的子集并赋值(.SD)它到感兴趣的列

:=