2015-12-21 67 views
3

说我有这个矩阵:展开计数的矩阵

set.seed(10) 
mat <- matrix(sample(0:3, 25, TRUE), ncol = 5) 
rownames(mat) <- month.abb[1:5] 
colnames(mat) <- state.name[1:5] 

mat 

##  Alabama Alaska Arizona Arkansas California 
## Jan  2  0  2  1   3 
## Feb  1  1  2  0   2 
## Mar  1  1  0  1   3 
## Apr  2  2  2  1   1 
## May  0  1  1  3   1 

我在寻找一个有效(非碱溶液欢迎)的方式来扩展每个观察/ n行第倍(最大n的决定如下所示(我不确定这个技术是否有名字,但如果有人对这个扩展有评论,我很想知道它叫什么,使得Google更容易)。

##  Alabama Alaska Arizona Arkansas California 
## Jan  1  0  1  1   1 
## Jan  1  0  1  0   1 
## Jan  0  0  0  0   1 
## Feb  1  1  1  0   1 
## Feb  0  0  1  0   1 
## Mar  1  1  0  1   1 
## Mar  0  0  0  0   1 
## Mar  0  0  0  0   1 
## Apr  1  1  1  1   1 
## Apr  1  1  1  0   0 
## May  0  1  1  1   1 
## May  0  0  0  1   0 
## May  0  0  0  1   0 

回答

4

这,也,......不知何故,似乎无效:

maxs = mat[cbind(seq_len(nrow(mat)), max.col(mat, "first"))] 
(mat[rep(seq_len(nrow(mat)), maxs), ] >= sequence(maxs)) + 0L 
# Alabama Alaska Arizona Arkansas California 
#Jan  1  0  1  1   1 
#Jan  1  0  1  0   1 
#Jan  0  0  0  0   1 
#Feb  1  1  1  0   1 
#Feb  0  0  1  0   1 
#Mar  1  1  0  1   1 
#Mar  0  0  0  0   1 
#Mar  0  0  0  0   1 
#Apr  1  1  1  1   1 
#Apr  1  1  1  0   0 
#May  0  1  1  1   1 
#May  0  0  0  1   0 
#May  0  0  0  1   0 
3

我不知道这是什么扩展名为但这里做到这一点的一种方法:

expand.row <- function(x) { 
    out <- matrix(rep(rep(1:0, times=length(x)), c(rbind(x,max(x)-x))), ncol=length(x)) 
    colnames(out) <- names(x) 
    return(out) 
} 

mat2 <- do.call(rbind,apply(mat,1,expand.row)) 
rownames(mat2) <- rep(rownames(mat), apply(mat, 1, max)) 

##  Alabama Alaska Arizona Arkansas California 
## Jan  1  0  1  1   1 
## Jan  1  0  1  0   1 
## Jan  0  0  0  0   1 
## Feb  1  1  1  0   1 
## Feb  0  0  1  0   1 
## Mar  1  1  0  1   1 
## Mar  0  0  0  0   1 
## Mar  0  0  0  0   1 
## Apr  1  1  1  1   1 
## Apr  1  1  1  0   0 
## May  0  1  1  1   1 
## May  0  0  0  1   0 
## May  0  0  0  1   0 

希望有人会来从一个知名的封装提供了明显的作用,但也许这会让你在那之前。

+1

增加rownames修复;随时回滚。 –

+0

@TylerRinker呃!你打败了我,哈哈!从字面上看,我的想法完全一样。 +1 – brittenb

+0

@TylerRinker看起来不错。我希望能够在不创建另一个对象的情况下获取行名,但我想不出如何。 –

2

这里有一个dplyr选项:

library(dplyr) 

# Expand the number of rows 
mat.exp = mat[rep(rownames(mat), apply(mat, 1, max)),] 

# Get the 1s and 0s right 
mat.exp = mat.exp %>% as.data.frame %>% add_rownames %>% 
    group_by(rowname) %>% 
    mutate_each(funs(c(rep(1,.[1]), rep(0,n() - .[1])))) 

# Convert back to matrix and add back rownames 
mat.exp = as.matrix(mat.exp[,-1]) 
rownames(mat.exp) = rep(rownames(mat), apply(mat, 1, max)) 

mat.exp 

     Alabama Alaska Arizona Arkansas California 
    Jan  1  0  1  1   1 
    Jan  1  0  1  0   1 
    Jan  0  0  0  0   1 
    Feb  1  1  1  0   1 
    Feb  0  0  1  0   1 
    Mar  1  1  0  1   1 
    Mar  0  0  0  0   1 
    Mar  0  0  0  0   1 
    Apr  1  1  1  1   1 
    Apr  1  1  1  0   0 
    May  0  1  1  1   1 
    May  0  0  0  1   0 
    May  0  0  0  1   0