#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