Reputation: 1378
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
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
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
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