2017-07-17 72 views
-1

我有一个数据矩阵矩阵划分,使每个数据帧包含重复行

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 

任何帮助,将不胜感激

+0

你尝试过这么远吗? – lmo

+0

@Imo拼贴是我的数据框的名字,所以我试图分裂(拼贴,F =勾搭[,1])勾搭[,1] [复制(勾搭[,1])]] – Hibu

+0

添加你试过什么的你的身体而不是在评论中。如果数据集很大,通过粘贴'dput(ganging)'或'dput(head(ganging,20))'的输出,在你的问题中包含一个你的data.frame的玩具示例。 – lmo

回答

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 

要添加的名称,你可以在“组”粘贴到像这样的列表项的索引。

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) 
+0

@Imo非常感谢您的帮助!它工作完美。我怎么能给这些组我自己的名字像Group1和Group2?我有一个巨大的数据集,在这里我只给了一小部分。 – Hibu