2012-03-06 31 views
0

我想通过组变量在矩阵行中找到缺失观察值的独特组合。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 

回答

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)得到数值矩阵。