[R] Extract data from Array to Table

Sven E. Templer sven.templer at gmail.com
Thu Feb 12 09:10:21 CET 2015


Make use of the plyr and reshape2 package (both on CRAN):

library(plyr)
d<-adply(ArrayDiseaseCor, 1:2)
# adply calls function identity by default
d<-melt(d)
d<-subset(d,value>.5)
head(d)

You will have to rename columns, or adjust arguments in melt/adply.
Note: use set.seed before sampling for reproducible code!

Best, S.

On 11 February 2015 at 17:11, Karim Mezhoud <kmezhoud at gmail.com> wrote:
> Dear All,
> I am facing the task to extract data from array to table. here an example
> of array.
>
> ##Get A list of Matrices with unequal rows
>
> Disease <- NULL
> Diseases <- NULL
> ListMatByGene <- NULL
> for(i in 1:3){
>
> Disease[[i]] <-matrix(sample(-30:30,25+(5*
> i)),5+i)
> rownames(Disease[[i]]) <- paste0("Sample",1:(5+i))
> colnames(Disease[[i]]) <- paste0("Gene",1:5)
>
> D <- paste0("Disease",i)
> Diseases[[D]] <- Disease[[i]]
> }
>
>
> ## get the same Column from all matrices
> getColumn <- function(x, colNum, len = nrow(x)){
>     y <- x[,colNum]
>     length(y) <- len
>     y
> }
>
> ## get Matrices by the same columns of the list of matrices
> getMatrices <- function(colNums, dataList = x){
>     # the number of rows required
>     n <- max(sapply(dataList, nrow))
>     lapply(colNums, function(x, dat, n) { # iterate along requested columns
>         do.call(cbind, lapply(dat, getColumn,x, len=n)) # iterate along
> input data list
>     }, dataList, n)
> }
>
> ## Rotate the list of matrices by 90°
> G <- paste0("Gene",1:5)
> ListMatByGene[G] <- getMatrices(c(1:ncol(Diseases[[1]])),dataList=Diseases)
>
> ## get Disease correlation by gene
> DiseaseCorrelation <- lapply(ListMatByGene,function(x) cor(x,use="na",
> method="spearman"))
>
> ##convert the list of Matrices to array
> ArrayDiseaseCor <- array(unlist(DiseaseCorrelation), dim =
> c(nrow(DiseaseCorrelation[[1]]), ncol(DiseaseCorrelation[[1]]),
> length(DiseaseCorrelation)))
> dimnames(ArrayDiseaseCor) <- list(names(Diseases), names(Diseases),
> colnames(Diseases[[1]]))
>
> ## Select only correlation bigger than 0.5 from the array
> FilterDiseaseCor <- apply(ArrayDiseaseCor,MARGIN=c(1,2) ,function(x)
> x[abs(x)>0.5])
>
> ## Final result
> FilterDiseaseCor
>
>          Disease1   Disease2  Disease3
> Disease1 Numeric,5  Numeric,2 -0.9428571
> Disease2 Numeric,2  Numeric,5 Numeric,2
> Disease3 -0.9428571 Numeric,2 Numeric,5
>
>
> Question is:
> How can get a table as:
>
> D1              D2               Cor       Gene
> Disease1    Disease2      -0.94    Gene2
> Disease1    Disease2       0.78    Gene4
> Disease3    Disease2       0.5      Gene5
> ...
>
> and
>                  Disease1   Disease2      Disease3
> Disease1        5                1                0
> Disease2        1                 5                3
> Disease3        0                  3               5
>
> Or in general, How can I extract data from Array to Table?
>
> Thanks
> Karim
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> 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