我有一个包含不同长度字符向量的列表(每个向量元素在列表中都是唯一的)。现在,我想通过此元素访问包含特定元素的列表的组件名称。为了更清楚一点,我的列表基本上如下所示:
l <- list(alpha = c("a", "b", "c"), beta = c("x", "y"))
$alpha
[1] "a" "b" "c"
$beta
[1] "x" "y"
我现在有一个包含列表元素的数据框:
df = data.frame(name = c("a", "b", "c", "x", "y"))
通过mutate,我现在想获取包含相应元素的列表组件的名称,所以
name corr
1 a alpha
2 b alpha
3 c alpha
4 x beta
5 y beta
我会知道如何通过循环执行此操作,但是这在计算上是不可行的,也不是很好的代码;)有人知道如何解决该问题吗?
答案 0 :(得分:2)
我们可以使用stack
来获取data.frame
stack(l)
或使用enframe
library(tidyverse)
enframe(l, name = "corr", value = "name") %>%
unnest
# A tibble: 5 x 2
# corr name
# <chr> <chr>
#1 alpha a
#2 alpha b
#3 alpha c
#4 beta x
#5 beta y
如果我们想从作为函数参数的list
元素的值中获取list
元素的名称
f1 <- function(lstData, elem) {
i1 <- sapply(lstData, function(x) elem %in% x)
names(lstData[i1])
}
f1(l, "x")
#[1] "beta"
或者在先转换为data.frame/tibble
之后,先转换filter
和pull
“名称”列中的值
f2 <- function(lstData, elem) {
tibble::enframe(lstData, name = "corr", value = "name") %>%
tidyr::unnest(.) %>%
dplyr::filter(name == elem) %>%
dplyr::pull(corr)
}
f2(l, 'x')
#[1] "beta"