Проблемы с извлечением элементов из вложенного списка психологии с использованием dplyr и purrr

#r #list #dplyr #purrr #psych

#r #Список #dplyr #purrr #psych

Вопрос:

У меня есть вложенный фрейм данных в R, к которому я применяю функцию из пакета psych. Я добавляю результирующий список во фрейм данных. Теперь я хотел бы создать новый столбец, который содержит определенный элемент из этого списка. В принципе, я знаю, как это работает, но по какой-то причине результирующий список равен NULL. Я могу убедиться, что список, из которого я извлекаю, не пуст, поэтому мне интересно, в чем проблема. Любая помощь была бы высоко оценена. Воспроизводимый пример ниже.

 library(psych)
library(tidyverse)

tibble( A = c( 1, 2, 3, 4),
        B = c( 1, 2, 3 ,4),
        C = c( 2, 3, 3, 5),
        group = c( 1, 1, 1, 1))%>%
      group_by( group) %>%
      nest() %>% 
      mutate( ICC_results = data %>% map( ICC)) -> df

# Now I would like to add a variable containing a numeric element from the list, so ideally use map_dbl, but that gives an error because extracting any element from the list results in an empty list

 df  %>%
       mutate( ICC3 = ICC_results %>% map( 9)) 

# A tibble: 1 x 4
# Groups:   group [1]
  group data             ICC_results ICC3  
  <dbl> <list>           <list>      <list>
1     1 <tibble [4 x 3]> <psych>     <NULL>

# I can verify that the element I am looking to extract is not empty
df %>%
  select( ICC_results) %>%
  unlist() %>%
  str()

List of 76
 $ ICC_results.results.type1       : chr "ICC1"
 $ ICC_results.results.type2       : chr "ICC2"
 $ ICC_results.results.type3       : chr "ICC3"
 $ ICC_results.results.type4       : chr "ICC1k"
 $ ICC_results.results.type5       : chr "ICC2k"
 $ ICC_results.results.type6       : chr "ICC3k"
 $ ICC_results.results.ICC1        : num 0.857
 $ ICC_results.results.ICC2        : num 0.862
 $ ICC_results.results.ICC3        : num 0.949
 $ ICC_results.results.ICC4        : num 0.947
 $ ICC_results.results.ICC5        : num 0.949
 $ ICC_results.results.ICC6        : num 0.982
 ....
  

Комментарии:

1. из какого элемента вы хотите извлечь str(df$ICC_results) ?

2. 9-й элемент. Я пробовал оба map(9) и map("ICC_results.results.ICC3") , и все варианты, такие как extract, pluck и подобные… Ничего не работает.

3. @Waldi: Спасибо за подсказку, я думаю, что я понял это.

4. Отлично, что-то вроде df$ICC_results[[1]]$results$ICC[[3]] ?

5. Что-то вроде того, что предложил @tmfmnk, но менее красивое. Поэтому я щадю мир и воздерживаюсь от публикации этого 🙂

Ответ №1:

Одним из вариантов может быть:

 df %>%
 group_by(group) %>%
 nest() %>% 
 mutate(ICC_results = map_dbl(data, 
                              ~ pluck(ICC(.), "results") %>% 
                               filter(type == "ICC3") %>%
                               pull(ICC)))

  group data             ICC_results
  <dbl> <list>                 <dbl>
1     1 <tibble [4 × 3]>       0.949