2014-03-04 44 views
3

假设你减少的阵列具有3维4x4x2数组:R:根据选择器

foo <- structure(c(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1), .Dim = c(4L, 4L, 2L), .Dimnames = list(c("p1", "p2", "p3", "p4"), c("f1", "f2", "f3", "f4"), c("t1", "t2"))) 
foo 

, , t1 

    f1 f2 f3 f4 
p1 1 1 0 0 
p2 0 1 0 0 
p3 0 0 0 0 
p4 0 0 0 0 

, , t2 

    f1 f2 f3 f4 
p1 0 0 0 0 
p2 0 1 0 0 
p3 0 1 1 1 
p4 0 0 0 1 

此外,还具有矩阵这对第一尺寸的选择器(P):

bar <- structure(c(1, 1, 2, 2), .Dim = c(4L, 1L), .Dimnames = list(c("p1", "p2", "p3", "p4"), NULL))  [,1] 
bar 
p1 1 
p2 1 
p3 2 
p4 2 

如何创建以下两个阵列?

阵列1具有(在任一T1或T2,因为p1和p2是不相关的F3和F4)的行p1和p2(如由栏选择)和列f1和f2:

, , t1 

    f1 f2 
p1 1 1 
p2 0 1 

, , t2 

    f1 f2 
p1 0 0 
p2 0 1 

阵列2具有列P3和P4(再次如由栏选择)和列F2,F3和F4(因为P3和P4是不相关的在T1或T2的F1)。其中()

, , t2 

    f2 f3 f4 
p3 1 1 1 
p4 0 0 1 

我沿着集的行思(),应用(),并且,但这并没有得到我在任何地方:此外,第三尺寸减小到T2。

这是一个玩具的例子。最终的代码应该被应用于随着时间(t)类似于2模式网络(模式p和f)的矩阵。

任何帮助表示热烈赞赏。

回答

3

这样吗?

lapply(unique(bar),function(x){ 
    flip<-Reduce('+',lapply(dimnames(foo)[[3]],function(z){ 
    t(foo[names(bar[bar==x]),,z]) 
    } 
     )) 
    n<-dimnames(flip[rowSums(flip)!=0,]) 
    foo[n[[2]],n[[1]],] 
} 
     ) 

[[1]] 
, , t1 

    f1 f2 
p1 1 1 
p2 0 1 

, , t2 

    f1 f2 
p1 0 0 
p2 0 1 


[[2]] 
, , t1 

    f2 f3 f4 
p3 0 0 0 
p4 0 0 0 

, , t2 

    f2 f3 f4 
p3 1 1 1 
p4 0 0 1 
+0

嗨特洛伊,这正是我所需要的 - 适用于更大的阵列和更多的组。非常感谢! – hyco

3

这里是另一种选择:

lapply(unique(bar), function(i) { 
    foo.row <- foo[rownames(foo) %in% rownames(bar)[bar == i],,] 
    foo.row[, apply(foo.row, 2, any), apply(foo.row, 3, any), drop=F] 
}) 

产地:

[[1]] 
, , t1 

    f1 f2 
p1 1 1 
p2 0 1 

, , t2 

    f1 f2 
p1 0 0 
p2 0 1 


[[2]] 
, , t2 

    f2 f3 f4 
p3 1 1 1 
p4 0 0 1 

您可以忽略警告。它们只是将值强制为逻辑值any。如果他们打扰你,你总是可以做一些事情,如function(x) any(as.logical(x))

+0

嗨BrodieG,我复制并粘贴您的代码,并没有得到你的结果。这是为什么?你的代码比@ Troy's更精简,只有一个功能。 Thx – hyco

+0

BrodieG,我明白了!你的代码是为类(bar)编写的,它是一个矩阵,@特洛伊的class(bar)代码是数字。不幸的是,当我复制/粘贴我的问题时,我通过缺失的换行符创建了这种模糊性。 – hyco

+1

@hyco,我刚刚从您的问题中直接复制了您的数据,并将其作为矩阵。另外请注意,这应该适用于更大的阵列等。 – BrodieG