在几个数据框中划分矩阵,以便每个数据框包含重复的行

时间:2017-07-17 16:52:45

标签: r

我有一个数据矩阵

dataA <- matrix(c(0.74, 1.00,0.56, 0.74, 1.00,0.56, 0.74, 1.00, 0.56,0.39, 0.79, 0.35, 0.39, 0.79, 0.35),  ncol=3, nrow=3)

看起来像:

     [,1]   [,2]   [,3]       
[1,] 0.74   1.00   0.56     
[2,] 0.74   1.00   0.56     
[3,] 0.74   1.00   0.56     
[4,] 0.39   0.79   0.35     
[5,] 0.39   0.79   0.35 

我需要得到的是两个数据框,如下所示:

组别1

      [,1]   [,2]   [,3]   
1     0.74   1.00   0.56     
2     0.74   1.00   0.56     
3     0.74   1.00   0.56 

组2

      [,1]   [,2]   [,3]
 4    0.39   0.79   0.35     
 5    0.39   0.79   0.35 

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

这是一种方法。使用applypaste将行元素的向量作为每行一个字符串。将此值提取到split以及矩阵的行数,以便按重复项分解矩阵行。然后将split输出的分组行列表提供给lapply,以执行数据A的子集化。

myMatList <- lapply(split(seq_len(nrow(dataA)),
                          apply(dataA, 1, paste, collapse=" ")),
                    function(x) dataA[x,])

返回

myMatList

$`0.39 0.79 0.35`
     [,1] [,2] [,3]
[1,] 0.39 0.79 0.35
[2,] 0.39 0.79 0.35

$`0.74 1 0.56`
     [,1] [,2] [,3]
[1,] 0.74    1 0.56
[2,] 0.74    1 0.56
[3,] 0.74    1 0.56

要添加名称,您可以粘贴&#34; Group&#34;到像这样的列表项的索引。

names(myMatList) <- paste0("Group", seq_along(myMatList))

如果在名称中维护矩阵的顺序很重要,可以使用match

# use index from match() as argument to paste0
names(myMatList) <- paste0("Group", match(names(myMatList),
                                          unique(apply(dataA, 1, paste, collapse=" "))))

其中unique(apply(dataA, 1, paste, collapse=" ")))包含原始顺序中矩阵的唯一行表。

数据

dataA <- matrix(c(rep(c(0.74, 1.00,0.56), 3), rep(c(0.39, 0.79, 0.35), 2)), 5, byrow=TRUE)