基于多列子集数组

时间:2014-11-20 17:14:55

标签: arrays r subset

我在r中有一个大数组,并希望使用从不同矩阵获得的点对其进行子集化。

即。

,,1 
34  1  1  3  4
32  1  3  4  5
23  1  1  3  4
35  1  3  4  4
23  1  2  3  4

,,2 
234  1  1  3  4
32   1  3  4  5
324  1  1  3  4
23   1  3  4  4
232  1  2  3  4 

并希望它返回

34  1  1  3  4
23  1  1  3  4
23  1  2  3  4
234  1  1  3  4
324  1  1  3  4
232  1  2  3  4 

以某种格式。

这些特定行将根据我选择的最后3列返回 (即我想要所有行的最后3位数字1,3,4和2,3,4)

1 个答案:

答案 0 :(得分:1)

一种方法是

m1 <- apply(ar1, 2, `[`)
m1[m1[,2]%in% 1:2 & m1[,3]==3 & m1[,4]==4,]
 #      [,1] [,2] [,3] [,4]
#[1,]    1    1    3    4
#[2,]    1    1    3    4
#[3,]    1    2    3    4
#[4,]    1    1    3    4
#[5,]    1    1    3    4
#[6,]    1    2    3    4

或者

 res <- do.call(rbind,lapply(seq(dim(ar1)[3]), function(i) {
                      x1 <- ar1[,,i]
                      x2 <- t(x1[,-1])
                     x1[colSums(x2==c(1,3,4)|x2==c(2,3,4))==3,]}))

res

#     [,1] [,2] [,3] [,4]
#[1,]    1    1    3    4
#[2,]    1    1    3    4
#[3,]    1    2    3    4
#[4,]    1    1    3    4
#[5,]    1    1    3    4
#[6,]    1    2    3    4

更新

假设valuesmatchmatrix中,并且每行都是匹配的向量。

 toMatch <- rbind(c(1,3,4), c(2,3,4), c(4,3,2), c(1,9,4))
 indx1 <- apply(toMatch, 1, paste, collapse="")

 res <- do.call(rbind,lapply(seq(dim(ar1)[3]), function(i) {
                       x1 <- ar1[,,i]
                       x1[apply(x1[,-1], 1, paste, collapse='') %in% indx1,]
                                 }))

数据

ar1 <- structure(c(1, 1, 1, 1, 1, 1, 3, 1, 3, 2, 3, 4, 3, 4, 3, 4, 5, 
4, 4, 4, 1, 1, 1, 1, 1, 1, 3, 1, 3, 2, 3, 4, 3, 4, 3, 4, 5, 4, 
4, 4), .Dim = c(5L, 4L, 2L))