[R] merging tables based on both row and column names

Frank Schwidom schwidom at gmx.net
Mon Sep 28 23:23:54 CEST 2015


test1 <- (rbind(c(0.1,0.2),0.3,0.1))
rownames(test1)=c('y1','y2','y3')
colnames(test1) = c('x1','x2');
test2 <- (rbind(c(0.8,0.9,0.5),c(0.5,0.1,0.6)))
rownames(test2) = c('y2','y5')
colnames(test2) = c('x1','x3','x2')


lTest12 <- list( test1, test2)
namesRow <- unique( unlist( lapply( lTest12, rownames)))
namesCol <- unique( unlist( lapply( lTest12, colnames)))
tmp1 <- do.call( cbind, lapply( lTest12, function( x) as.vector( x[ match( namesRow, rownames( x)), match( namesCol, colnames( x))])))
tmp2 <- apply( tmp1, 1, list)
tmp3 <- lapply( tmp2, function( x) x[[1]][ !is.na( x[[1]])])
dimnames1 <- list( namesRow, namesCol)
tmp4 <- array( data= tmp3, dim= sapply( dimnames1, length), dimnames= dimnames1)

paste( tmp4)

 [1] "0.1"         "c(0.3, 0.8)" "0.1"         "0.5"         "0.2"        
 [6] "c(0.3, 0.5)" "0.1"         "0.6"         "numeric(0)"  "0.9"        
[11] "numeric(0)"  "0.1"        

tmp4
   x1        x2        x3       
y1 0.1       0.2       Numeric,0
y2 Numeric,2 Numeric,2 0.9      
y3 0.1       0.1       Numeric,0
y5 0.5       0.6       0.1      


Regards.


On 2015-09-28 18:46:18, C Lin wrote:
> Dear R users,
> 
> I am trying to merge tables based on both their row names and column names.
> My ultimate goal is to build a distribution table of values for each combination of row and column names. 
> I have more test tables, more x's and y's than in the toy example below. 
> Thanks in advance for your help.
> 
> For example :
> test1 <- data.frame(rbind(c(0.1,0.2),0.3,0.1))
> rownames(test1)=c('y1','y2','y3')
> colnames(test1) = c('x1','x2');
> test2 <- data.frame(rbind(c(0.8,0.9,0.5),c(0.5,0.1,0.6)))
> rownames(test2) = c('y2','y5')
> colnames(test2) = c('x1','x3','x2')
> 
> test1
>        x1   x2
> y1  0.1  0.2
> y2  0.3  0.3
> y3  0.1  0.1
> 
> test2
>        x1   x3   x2
> y2  0.8  0.9  0.5
> y5  0.5  0.1  0.6
> 
> I would like to combine test1 and test2 such that if the column name and row name are both the same they are combined.
> 
> combined_test
>            x1              x2             x3
> y1      0.1              0.2           NA
> y2  (0.3,0.8)    (0.3,0.5)      0.9
> y3      0.1              0.1           NA
> y5      0.5              0.6           0.1
> 
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



More information about the R-help mailing list