【问题标题】:Matrix from rows with delimited items in RR中带有分隔项的行的矩阵
【发布时间】:2015-06-09 22:19:24
【问题描述】:

我有一个这样的数据库,行中有分号分隔的值:

A;1;3;5;7;9
B;1;2;3
C;1;3;5
D;2;4;8

每行中的项目数不同。每一项在每一行中只有一次(不重复)。

我想为项目库协同过滤制作一个矩阵。删除第一列有字母的,数字变成这样:

1 2 3 4 5 6 7 8 9
-----------------
1 0 1 0 1 0 1 0 1
1 1 1 0 0 0 0 0 0
1 0 1 0 1 0 0 0 0
0 1 0 1 0 0 0 0 0

你能给我一个如何管理它的建议吗?

【问题讨论】:

  • 您在寻找table 吗?
  • 很确定这已被多次询问和回答(并不是说我一定能够通过搜索找到它)。基本范例是堆叠输入以构建一个两列矩阵作为“[

标签: r matrix


【解决方案1】:

这是一个选项。我们将字符串读入一个字符向量,; 上的strsplit,初始化空矩阵,然后使用具有所有列值的行的矩阵索引为每一行分配:

DAT <- readLines(textConnection("A;1;3;5;7;9
B;1;2;3
C;1;3;5
D;2;4;8"))

DAT.NUM <- lapply(strsplit(DAT, ";"), function(x) as.integer(x[-1]))
RES <- matrix(0L, length(DAT), max(unlist(DAT.NUM)))
for(i in seq_along(DAT)) RES[cbind(i, DAT.NUM[[i]])] <- 1L

生产:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    1    0    1    0    1    0    1    0    1
[2,]    1    1    1    0    0    0    0    0    0
[3,]    1    0    1    0    1    0    0    0    0
[4,]    0    1    0    1    0    0    0    1    0

或者,受@user227710 的启发,您可以:

t(table(stack(setNames(DAT.NUM, seq_along(DAT.NUM)))))

产生:

   values
ind 1 2 3 4 5 7 8 9
  1 1 0 1 0 1 1 0 1
  2 1 1 1 0 0 0 0 0
  3 1 0 1 0 1 0 0 0
  4 0 1 0 1 0 0 1 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2021-04-09
    相关资源
    最近更新 更多