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

Giorgio Garziano giorgio.garziano at ericsson.com
Thu Oct 1 17:26:30 CEST 2015


I reworked Frank Schwidom's solution to make it shorter than its original version.

  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)))

# here reworked code starts

  tmp1 <- sapply(lTest12, function(x) as.vector( x[match(namesRow, rownames(x)), match(namesCol, colnames(x))]))
  tmp2 <- apply(tmp1, 1, function(x) { na.omit(x) })
  dimnames1 <- list(namesRow, namesCol)
  tmp3 <- array(data = tmp2, dim = sapply(dimnames1, length), dimnames = dimnames1)
  tmp3

  > paste(tmp3)
  [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"

  > tmp3
  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
  >

  > tmp3["y2","x1"]
  [[1]]
  [1] 0.3 0.8

  > tmp3["y2","x2"]
  [[1]]
  [1] 0.3 0.5


	[[alternative HTML version deleted]]



More information about the R-help mailing list