R:按组分组的唯一矩阵

时间:2012-03-06 01:05:53

标签: r

我想通过组变量找到矩阵行中缺失观察的唯一组合。

我可以使用示例数据集通过使用显示的子集,cbind和rbind命令序列来生成矩阵u3。

但是,我怀疑有一种更好的方法,不会涉及为组变量的每个级别“手动”子集化矩阵。我尝试在底部使用tapply命令,但无法使其工作。

真诚地感谢您的任何建议。

my.data  <- matrix(c( 

            1, 0, 1, 1, 1,
            NA, 1, 1, 0, 1,
            NA, 0, 0, 0, 1,
            NA, 1,NA, 1, 1,
            NA, 1, 1, 1, 1,
             0, 0, 1, 0, 1,
            NA, 0, 0, 0, 1,
             0,NA,NA,NA, 1,
             1,NA,NA,NA, 1,
             1, 1, 1, 1, 1,
            NA, 1, 1, 0, 1,

            1, 0, 1, 1, 2,
            1, 1, NA, 0, 2,
            NA, NA, NA, 0, 2,
            NA, NA,NA, 1, 2,
             1, 1, 1, NA, 2,
             0, 0, 1, 0, 2,
            NA, 0, 0, 0, 2,
             0,NA,NA,NA, 2,
             1,NA,NA,NA, 2,
             1, 1, 1, 1, 2,
             0, 1, 1, NA, 2

), 
nrow=22, byrow=T, 
dimnames = list(NULL, c("c1","c2","c3","c4","my.group")))

my.data <- as.data.frame(my.data)
my.data

g1 <- subset(my.data, my.data$my.group==1)
u1 <- unique( is.na(g1[1:4]) )
u1 <- cbind(1,u1)

g2 <- subset(my.data, my.data$my.group==2)
u2 <- unique( is.na(g2[1:4]) )
u2 <- cbind(2,u2)

u3 <- rbind(u1,u2)
u3


tapply(my.data[,1:4], my.data$my.group, function(x) {unique(is.na(x), 'rows') } )

这是矩阵u3:

     c1 c2 c3 c4
1  1  0  0  0  0
2  1  1  0  0  0
4  1  1  0  1  0
8  1  0  1  1  1
12 2  0  0  0  0
13 2  0  0  1  0
14 2  1  1  1  0
16 2  0  0  0  1
18 2  1  0  0  0
19 2  0  1  1  1

1 个答案:

答案 0 :(得分:2)

您可以使用plyr包,这对于“将此功能应用于每个组”类型的应用程序来说非常棒。特别是,函数ddply

library(plyr)
u3 <- ddply(my.data,.(my.group),
      function(df)
          data.frame(unique(is.na(df[1:4])))
      )

然后u3看起来像这样:

   my.group    c1    c2    c3    c4
1         1 FALSE FALSE FALSE FALSE
2         1  TRUE FALSE FALSE FALSE
3         1  TRUE FALSE  TRUE FALSE
4         1 FALSE  TRUE  TRUE  TRUE
5         2 FALSE FALSE FALSE FALSE
6         2 FALSE FALSE  TRUE FALSE
7         2  TRUE  TRUE  TRUE FALSE
8         2 FALSE FALSE FALSE  TRUE
9         2  TRUE FALSE FALSE FALSE
10        2 FALSE  TRUE  TRUE  TRUE

您可以as.matrix(u3)来获取数值矩阵。