Matching elements of two lists of different sizes by their names

100 Views Asked by At

I have two lists of different sizes. One list (named * trees * ) is composed of phylogenetic trees (class phylo) and the second list (named * data_values*) is composed of numeric values. The tips names of each phylogenetic tree of the list * tree* match with the names of each element inside of the list of values. But the list data_values is composed of a greater number of elements than the tips of each tree.

library(phytools)
library(ape)
#original tree:
tree_original = rtree(12, tip.label = paste0("species", LETTERS[1:12]))
##list of trees:
nodes = 14:23
trees = lapply(nodes,extract.clade,phy=tree_orignal)
names(trees) <-  paste0("", 14:23)
data_values <- list() 
for (i in 1:17) { data_values[[paste0('species', LETTERS[i])]] <- round(rnorm(10, 5, 4), 1) }

I would like to match both lists (trees and data_values) using species as an index to have a data frame for each tree (see example below). I can do this operation for each tree of the list trees individually but, as my list of species is much bigger than this example, I would like to know if I can do this operation (below) for the all list of trees and not run tree by tree, like this:

tree14 = data_values[match(trees$`14`$tip.label, names(data_values))]
tree14 = llply(tree14, function(x) sapply(x, as.numeric)) 
tree14_df = ldply(tree14, .fun=identity)  **I will need each result as a data.frame**
        .id  1    2   3     4    5    6    7    8    9   10
1  speciesE -0.5 3.4  2.0  5.3  3.7  8.2  3.5 -2.0  3.1 10.2
2  speciesL  6.8 4.3  7.1  5.5  4.9  2.5  0.3 -3.8  4.1  6.4
3  speciesA  2.5 2.5  9.6 10.6  2.2  7.1  4.1  4.4  6.0  6.7
4  speciesI -3.5 7.2  6.8  2.8  7.5  8.9 13.4 13.1  1.8  5.5
5  speciesC  4.3 2.2 10.0  7.4  4.4  8.3 -0.7  3.6  9.2  6.3
6  speciesH  6.3 6.1  2.2  4.6  7.4  7.3  2.9  0.6  3.0  5.2
7  speciesB  8.3 1.7 -0.1  4.5  9.4 -0.2  7.5  1.4 -0.3  4.6
8  speciesD  6.2 5.8  6.6  1.1  5.4 11.1 -1.1  0.0  7.9  0.4
9  speciesG  3.5 2.8  1.4 11.6 -2.8 11.0  3.5  2.8  3.1  4.8
10 speciesK  0.9 4.9  5.4  2.7 -0.7  5.1 18.3  4.9  2.5 -0.7

tree15 = data_values[match(trees$`15`$tip.label, names(data_values))]
tree15 = llply(tree15, function(x) sapply(x, as.numeric)) 
tree15_df = ldply(tree15, .fun=identity) 
        .id 1    2    3    4   5    6    7   8    9   10
1 speciesE -0.5 3.4  2.0  5.3 3.7  8.2  3.5 -2.0  3.1 10.2
2 speciesL  6.8 4.3  7.1  5.5 4.9  2.5  0.3 -3.8  4.1  6.4
3 speciesA  2.5 2.5  9.6 10.6 2.2  7.1  4.1  4.4  6.0  6.7
4 speciesI -3.5 7.2  6.8  2.8 7.5  8.9 13.4 13.1  1.8  5.5
5 speciesC  4.3 2.2 10.0  7.4 4.4  8.3 -0.7  3.6  9.2  6.3
6 speciesH  6.3 6.1  2.2  4.6 7.4  7.3  2.9  0.6  3.0  5.2
7 speciesB  8.3 1.7 -0.1  4.5 9.4 -0.2  7.5  1.4 -0.3  4.6

... this operation goes until tree23
0

There are 0 best solutions below