Dplyr доступ к подэлементу всех элементов списка

Я пытаюсь использовать safe() из пакета purrr вместе с регрессией лассо из пакета glmnet. Я застрял в части перекрестной проверки, так как safe() возвращает список с двумя элементами: $results и $errors. Я пытаюсь получить только $results с помощью dplyr, но не могу заставить его работать.

Я могу заставить перекрестную проверку работать для одного вида, но не для всех, используя dplyr.

library(dplyr)
library(glmnet)
library(purrr)
data(iris)

# Group to perform regressions for every species
grouped <- iris %>% 
  group_by(Species)

# Make model matrices
mm <- grouped %>%
  do(mm = safely(model.matrix)(Sepal.Length ~ Sepal.Width + Petal.Width, data = .)[1])

# Join the dependent values with the model matrices in a tibble
sepallengths <- grouped %>% 
  summarise(Sepal.Length = list(Sepal.Length))
temp <- inner_join(sepallengths, mm, by = "Species")

# Perform cross validation using the tibble above
cv_holder <- temp %>% 
  group_by(Species) %>% 
  # How to get this to work inside dplyr?
  do(cv = safely(cv.glmnet)(.$mm[1]$result, .$Sepal.Length, alpha = 1, nlambda = 100))

# Contains only errors when it should contain the cross validations
cv_holder$cv

# Works for individual lists this way
safely(cv.glmnet)(temp$mm[[1]][1]$result, temp$Sepal.Length[[1]], alpha = 1, nlambda = 100)$result

Я ожидаю, что на выходе будет таблица (cv_holder) со столбцом (cv), который содержит списки, содержащие списки перекрестных проверок для каждого вида. Однако я могу заставить dplyr возвращать только ошибки, такие как «simpleError in rep(1, N): неверный аргумент «times»»

Вот как это можно сделать с помощью цикла:

for(i in 1:length(temp$mm)){
    print(safely(cv.glmnet)(temp$mm[[i]][1]$result, temp$Sepal.Length[[i]], alpha = 1, nlambda = 100))
cv_holder$error <- NULL
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
408
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам все равно нужно индексировать список, даже если есть только 1 значение.

Например.:

cv_holder <- temp %>% 
  group_by(Species) %>% 
  # How to get this to work inside dplyr?
  do(cv = safely(cv.glmnet)(.$mm[1][[1]]$result, .$Sepal.Length[[1]], alpha = 1, nlambda = 100))

Это всего лишь мнение, но: используйте tidyverse, когда данные в порядке. Используйте цикл for, когда это оправдано. Я не вижу смысла пытаться втиснуть что-то в рамки dplyr, когда это, очевидно, только больше запутывает.

Ответ принят как подходящий

Я заставил его работать с функцией pluck() из Purrr, которая выбирает первый элемент из каждого списка:

cv_holder <- temp %>% 
    group_by(Species) %>% 
    # Using pluck()
    do(cv = safely(cv.glmnet)(pluck(.$mm, 1)$result, pluck(.$Sepal.Length, 1), alpha = 1, nlambda = 100))

# Now works as intended
cv_holder$cv

Другие вопросы по теме