Looking once more at your example you might wish to consider tidyr::separate_rows() function to handle the comma separated values in your x2 column; something along the lines of:
input <- data.frame(animal = c("cat", "dog", "mouse", "catepillar"),
value = c(1,2,3,4))
print(input)
animal value
1 cat 1
2 dog 2
3 mouse 3
4 catepillar 4
codebook <- data.frame(animal = c("cat", "dog", "mouse", "catepillar"),
class = c("felis, carnivora, vertebrate", "canis, carnivora, vertebrate", "mus, rodentia, vertebrate", "larva, lepidoptera, insect"))
print(codebook)
animal class
1 cat felis, carnivora, vertebrate
2 dog canis, carnivora, vertebrate
3 mouse mus, rodentia, vertebrate
4 catepillar larva, lepidoptera, insect
codebook <- tidyr::separate_rows(codebook, class, sep = ',')
print(codebook)
animal class
1 cat felis
2 cat carnivora
3 cat vertebrate
4 dog canis
5 dog carnivora
6 dog vertebrate
7 mouse mus
8 mouse rodentia
9 mouse vertebrate
10 catepillar larva
11 catepillar lepidoptera
12 catepillar insect
output <- merge(input, codebook, by = "animal")
print(output)
animal value class
1 cat 1 felis
2 cat 1 carnivora
3 cat 1 vertebrate
4 catepillar 4 larva
5 catepillar 4 lepidoptera
6 catepillar 4 insect
7 dog 2 canis
8 dog 2 carnivora
9 dog 2 vertebrate
10 mouse 3 mus
11 mouse 3 rodentia
12 mouse 3 vertebrate