通过元素访问列表组件的名称

时间:2019-03-22 18:53:51

标签: r list

我有一个包含不同长度字符向量的列表(每个向量元素在列表中都是唯一的)。现在,我想通过此元素访问包含特定元素的列表的组件名称。为了更清楚一点,我的列表基本上如下所示:

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

我会知道如何通过循环执行此操作,但是这在计算上是不可行的,也不是很好的代码;)有人知道如何解决该问题吗?

1 个答案:

答案 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之后,先转换filterpull“名称”列中的值

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"