Invert a list / map
This article is originally published at https://logfc.wordpress.com
Often we use lists to map keywords onto values, for example
foo <- list(a=c("quark", "fark"), b=c("quark", "foo", "bark"), c=c("fark", "bark"))
To invert this list (such that “fark”, “bark” etc. become keywords, and “a”, “b” and “c” the values), do
foo.rev <- split(rep(names(foo), lengths(foo)), unlist(foo))
split
splits a vector or data frame along a factor. In this case, we expand the names of foo using rep
such that we get two vectors, as can be seen with the following command:
cbind(rep(names(foo), lengths(foo)), unlist(foo))
with the result
[,1] [,2] a1 "a" "quark" a2 "a" "fark" b1 "b" "quark" b2 "b" "foo" b3 "b" "bar" c1 "c" "fark" c2 "c" "bar"
When we apply split()
to the first vector with the second to guide the split, we will get
$bar [1] "b" "c" $fark [1] "a" "c" $foo [1] "b" $quark [1] "a" "b"
Thanks for visiting r-craft.org
This article is originally published at https://logfc.wordpress.com
Please visit source website for post related comments.