2016-06-28 1 views

答えて

1

少し複雑、それが動作するはずです:私は中断した場合

m <- as.matrix(data.frame('a'=c(5,2),'a,b'=c(2,1), 
          'a,b,c'=c(1:1),'c'=c(2,1), 
          check.names = FALSE,row.names=c('d','d,e'))) 
colNamesSplits <- strsplit(colnames(m),',') 
rowNamesSplits <- strsplit(rownames(m),',') 

colNms <- unique(unlist(colNamesSplits)) 
rowNms <- unique(unlist(rowNamesSplits)) 

colIdxs <- unlist(sapply(1:length(colNamesSplits), 
         function(i) rep.int(i,length(colNamesSplits[[i]])))) 
rowIdxs <- unlist(sapply(1:length(rowNamesSplits), 
         function(i) rep.int(i,length(rowNamesSplits[[i]])))) 
colIdxsMapped <- unlist(sapply(colNamesSplits, function(n) match(n,colNms))) 
rowIdxsMapped <- unlist(sapply(rowNamesSplits, function(n) match(n,rowNms))) 

# let's create the fully expanded matrix 
expanded <- as.matrix(m[rowIdxs,colIdxs]) 
rownames(expanded) <- rowNms[rowIdxsMapped] 
colnames(expanded) <- colNms[colIdxsMapped] 

# aggregate expanded by cols : 
expanded <- do.call(cbind,lapply(split(1:ncol(expanded),colnames(expanded)), 
       function(ii) rowSums(expanded[,ii,drop=FALSE]))) 
# aggregate expanded by rows : 
expanded <- do.call(rbind,lapply(split(1:nrow(expanded),rownames(expanded)), 
       function(ii) colSums(expanded[ii,,drop=FALSE]))) 

> expanded 
    a b c 
d 12 5 5 
e 4 2 2 
+0

は、恐れ入りますが、この「DF」とは何ですか?私は元の行列を意味するのですか? – lkn2993

+0

@ lkn2993:はいそれは誤植です(最初はm行列はDFと呼ばれていました).Fixed;) – digEmAll

関連する問題