【问题标题】:How to recode values in a matrix based on a calculation?如何根据计算重新编码矩阵中的值?
【发布时间】:2017-01-13 11:48:01
【问题描述】:

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

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

提前致谢!

【问题讨论】:

    标签: r data.table calculation recode


    【解决方案1】:

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

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

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

    【讨论】:

    • 这似乎可行,但是,它也会更改我的 eventID 列中的所有 1(例如,id # 1010 将算作两个 1,因为它的数字。任何更改以避免此列?
    • @StefanMusch 我在df 中使用索引-1 忽略了这一点。它将忽略数据框中的第一列。
    • @StefanMusch 我发布了一个 data.table 答案。请检查一下。没有这个问题
    【解决方案2】:

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

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

    【讨论】:

    • Akrun,请不要复制粘贴我的答案,只需稍作改动。你在那里有一个 for 循环。探索你的创造力。
    • @RonakShah 这不是你的答案。请检查
    • 我很清楚你所有的伎俩。如果您对我在说什么有疑问,请查看您的编辑修订。
    • @RonakShah 可能是我复制/粘贴了错误的。
    • 不错的解决方案,效果很好。感谢您的帮助!
    【解决方案3】:

    举个例子

    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
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 2015-05-17
      相关资源
      最近更新 更多