mattbawn
mattbawn

Reputation: 1378

Fill matrix from list based on column name match from other list

I have some data:

num.list1 <- list(1,2,1,4,5)
num.list2 <- list(2,3)
num.list3 <- list(3,5,2)

num.data.list <- list(num.list1, num.list2, num.list3)

name.list1 <- list("A","B","C","D","E")
name.list2 <- list("B","C")
name.list3 <- list("A","C","E")

name.data.list <- list(name.list1, name.list2, name.list3)

all.names <- unique(unlist(name.data.list))

my.matrix <- matrix(data = NA, nrow = length(name.data.list), ncol =     length(all.names))

colnames(my.matrix) <- all.names

I would like to populate my.matrix with the values from num.data.list based on matching the column names of my.matrix with the values in name.data.list.

i.e. :

      A    B    C    D    E

1     1    2    1    4    5  

2     NA   2    3    NA   NA

3     3    NA   5   NA    2

Any Ideas? Thanks.

Upvotes: 3

Views: 1538

Answers (3)

akuiper
akuiper

Reputation: 214957

Here is another option you can do with Map and rbindlist function, assuming that your names and data are in such an order that each element in num.data.list match the corresponding element in the name.data.list.

library(data.table);

rbindlist(Map(function(x, y) setNames(data.frame(x), y), 
          num.data.list, name.data.list), fill = T)
    A  B C  D  E
1:  1  2 1  4  5
2: NA  2 3 NA NA
3:  3 NA 5 NA  2

Upvotes: 2

eddi
eddi

Reputation: 49448

Using matrix subsetting:

library(reshape2)

nm = melt(name.data.list)

my.matrix[matrix(c(nm$L1, match(nm$value, all.names)), ncol = 2)] = unlist(num.data.list)
#      A  B C  D  E
#[1,]  1  2 1  4  5
#[2,] NA  2 3 NA NA
#[3,]  3 NA 5 NA  2

Upvotes: 3

nicola
nicola

Reputation: 24480

I'd start to give num.data.list and name.data.list the proper structure:

num.data.list<-lapply(num.data.list,unlist)
name.data.list<-lapply(name.data.list,unlist)

Then:

for (i in 1:nrow(my.matrix)) my.matrix[i,name.data.list[[i]]]<-num.data.list[[i]]
my.matrix
#      A  B C  D  E
#[1,]  1  2 1  4  5
#[2,] NA  2 3 NA NA
#[3,]  3 NA 5 NA  2

Upvotes: 2

Related Questions