2016-06-28 51 views
1

中的標籤求出二維表格的值來自Sum the values according to labels in R根據R

我已經通知與2代維表的工作是相當與一成維的人顯著不同,如:

 a a,b a,b,c c 
d 5  2  1  2 
d,e 2  1  1  1 

我們希望能夠實現:

 a b c 
d 12 5 5 
e 4 2 2 

那麼怎麼能這樣用R來實現?

回答

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」?我的意思是你的意思是「m」原始矩陣? – lkn2993

+0

@ lkn2993:對不起,這是一個錯字(最初m個矩陣被稱爲DF).Fixed;) – digEmAll