Доступ к имени компонента списка через элемент - PullRequest
0 голосов
/ 22 марта 2019

У меня есть список, содержащий символьные векторы различной длины (каждый элемент вектора уникален в списке). Теперь я хочу получить доступ к имени компонента списка, который содержит определенный элемент через этот элемент. Чтобы было понятнее, мой список выглядит в основном следующим образом:

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 Ответ

2 голосов
/ 22 марта 2019

Мы можем использовать 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...