2014-10-20 41 views
0

我有一个包含许多行和列的矩阵(rxp),我试图创建一个只包含具有相同单元值的行和列的子矩阵。例如创建具有相同单元格值的子矩阵

这是我的矩阵

a b c d 
a 0 1 1 1 
b 1 0 0 1 
c 1 0 0 1 
d 0 1 0 0 
e 0 1 1 1 

这里排bc具有相同的值,这样的代码应该创建一个只bc行和第2子矩阵行ae

,第一子矩阵
a b c d 
b 1 0 0 1 
c 1 0 0 1 

    a b c d 
a 0 1 1 1 
e 0 1 1 1 

回答

1

你也可以使用。

indx <- which(duplicated(m)) #m from @Richard Scriven post 

返回矩阵

lapply(indx, function(i) m[colSums(t(m)==m[i,])==ncol(m),]) 
[[1]] 
# a b c d 
#b 1 0 0 1 
#c 1 0 0 1 

[[2]] 
# a b c d 
#a 0 1 1 1 
#e 0 1 1 1 
+0

谢谢Akrun,它也可以。 – 2014-10-21 14:03:54

2

您可以在两个方向上使用duplicated

m[duplicated(m) | duplicated(m, fromLast=TRUE),] 
# a b c d 
# b 1 0 0 1 
# c 1 0 0 1 

哪里m

structure(c(0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 
1L, 1L, 0L), .Dim = c(4L, 4L), .Dimnames = list(c("a", "b", "c", 
"d"), c("a", "b", "c", "d"))) 
+1

我认为'米[复制(米,fromLast = TRUE)的列表|重复(m,fromLast = FALSE),]'不需要'sapply'就可以工作。 – eipi10 2014-10-20 22:33:48

+0

你是对的!我正在使用'&&混合起来。干杯! – 2014-10-20 22:34:48

+0

我的不好,我做了错误的....作品完美...感谢理查 – 2014-10-20 22:56:07

3

大概可以有一组以上的重复行的,所以如果m是你的矩阵这产生矩阵的列表,其中每个这样的矩阵具有重复的行:

DF <- as.data.frame(m) 
Filter(function(x) nrow(x) > 1, split(DF, do.call(paste, DF))) 
+1

是的,这是更合适的 – 2014-10-20 22:46:13

+0

@Grothendieck,我喜欢将我的数据集保存为矩阵格式 – 2014-10-20 22:53:26

相关问题