2017-04-24 37 views
-1

我是R编程新手。对于我的课程工作,我正在使用R实现推荐系统。我已经将数据表转换为矩阵,然后使用irlba函数处理SVD = udv。现在我有以下矩阵你。我需要根据符号组合来组合矩阵值(+ - )

svd sign matrix of u

现在我需要根据自己的标志对它们进行分类。例如,在这里,前三个是( - , - )的组合,然后是( - , - ),所以它们都必须在同一个社区中。然后第四和第五是( - ,+),他们在同一个社区等等。

回答

1

您可以在每列上使用sign并将它们粘贴到组合字符串中。然后将矩阵分成每个组合

set.seed(0L) 
mat <- matrix(rnorm(20), ncol=2) 
split(data.frame(mat), apply(mat, 1, function(x) paste(sign(x), collapse=", "))) 
#> $`-1, -1` 
#>   X1   X2 
#> 2 -0.3262334 -0.7990092 
#> 6 -1.5399500 -0.4115108 
#> 8 -0.2947204 -0.8919211 
#> 
#> $`-1, 1` 
#>    X1  X2 
#> 7 -0.928567035 0.2522234 
#> 9 -0.005767173 0.4356833 
#> 
#> $`1, -1` 
#>   X1   X2 
#> 3 1.3297993 -1.1476570 
#> 4 1.2724293 -0.2894616 
#> 5 0.4146414 -0.2992151 
#> 10 2.4046534 -1.2375384 
#> 
#> $`1, 1` 
#>   X1  X2 
#> 1 1.262954 0.7635935 
+0

谢谢。这真的很有帮助。 – Anu

+0

我在这个结果中还有一个问题。在我们将结果分成几个组后,我需要将每个组的行名称作为数字和商店(存储,我希望列表是更好的方式)。例如,需要跟踪(2,6,8),(7,9),(3,4,5,10),(1)。请帮我解决这个问题。 – Anu

+0

你可以使用lapply(result,rownames),其中结果是分割输出 – chinsoon12

1

另一种选择是

lapply(split(seq_len(nrow(mat)), 
    interaction(as.data.frame(sign(mat)))), function(i) mat[i,, drop = FALSE]) 
+0

嗨,这也是一样的过程。谢谢你的回答。 – Anu