Удаление элемента ошибки из списка списка с помощью purrr - PullRequest
0 голосов
/ 26 апреля 2019

Цель

Удаление элемента error и объединение всех столбцов вложенного фрейма данных с использованием пакета purrr.Пожалуйста, подскажите, какие функции я могу использовать для получения желаемого результата.

Пример данных

Я загрузил небольшое подмножество данных, которые вы можете найти здесь: https://1drv.ms/u/s!AsMFpkDhWcnw7xvU4JLg1Al9AqzA

Вы можете загрузить его: load(file = here::here("data", "raw_data", "veh.Rda")) А затем: ds_mainline_nested_acc <- veh

Вложенные данные

У меня есть следующие результаты из подбора модели:

ds_mainline_nested_acc <- ds_mainline %>% 
  group_by(file.ID2, LV, chunk_of_speed) %>% 
  nest() %>% 
  mutate(acc_mps2.ED = furrr::future_map(data, safely(find_acc), .progress = TRUE)) 

> ds_mainline_nested_acc
# A tibble: 2,676 x 5
   file.ID2 LV      chunk_of_speed data                   acc_mps2.ED
   <chr>    <chr>            <dbl> <list>                 <list>     
 1 Cars_01  WhiteC2              1 <tibble [1,857 x 148]> <list [2]> 
 2 Cars_01  WhiteC2              2 <tibble [1,856 x 148]> <list [2]> 
 3 Cars_01  WhiteC2              3 <tibble [1,856 x 148]> <list [2]> 
 4 Cars_01  WhiteC2              4 <tibble [1,856 x 148]> <list [2]> 
 5 Cars_01  WhiteC2              5 <tibble [1,857 x 148]> <list [2]> 
 6 Cars_01  Ford1                1 <tibble [549 x 148]>   <list [2]> 
 7 Cars_01  Ford1                2 <tibble [549 x 148]>   <list [2]> 
 8 Cars_01  Ford1                3 <tibble [549 x 148]>   <list [2]> 
 9 Cars_01  Ford1                4 <tibble [549 x 148]>   <list [2]> 
10 Cars_01  Ford1                5 <tibble [549 x 148]>   <list [2]> 
# ... with 2,666 more rows

Структура списка

> ds_mainline_nested_acc %>% select(-data) %>% transpose() %>% simplify_all() %>% str(list.len = 4)
List of 2676
 $ :List of 4
  ..$ file.ID2      : chr "Cars_01"
  ..$ LV            : chr "WhiteC2"
  ..$ chunk_of_speed: num 1
  ..$ acc_mps2.ED   :List of 2
  .. ..$ result:'data.frame':   1857 obs. of  2 variables:
  .. .. ..$ Time       : num [1:1857] 383 383 383 383 383 ...
  .. .. ..$ acc_mps2.ED: num [1:1857] 0.0515 0.0515 0.0515 0.0515 0.0515 ...
  .. ..$ error : NULL
 $ :List of 4
  ..$ file.ID2      : chr "Cars_01"
  ..$ LV            : chr "WhiteC2"
  ..$ chunk_of_speed: num 2
  ..$ acc_mps2.ED   :List of 2
  .. ..$ result:'data.frame':   1856 obs. of  2 variables:
  .. .. ..$ Time       : num [1:1856] 414 414 414 414 414 ...
  .. .. ..$ acc_mps2.ED: num [1:1856] 0.646 0.646 0.646 0.646 0.646 ...
  .. ..$ error : NULL
 $ :List of 4
  ..$ file.ID2      : chr "Cars_01"
  ..$ LV            : chr "WhiteC2"
  ..$ chunk_of_speed: num 3
  ..$ acc_mps2.ED   :List of 2
  .. ..$ result:'data.frame':   1856 obs. of  2 variables:
  .. .. ..$ Time       : num [1:1856] 445 445 445 445 445 ...
  .. .. ..$ acc_mps2.ED: num [1:1856] -0.395 -0.395 -0.395 -0.395 -0.395 ...
  .. ..$ error : NULL
 $ :List of 4
  ..$ file.ID2      : chr "Cars_01"
  ..$ LV            : chr "WhiteC2"
  ..$ chunk_of_speed: num 4
  ..$ acc_mps2.ED   :List of 2
  .. ..$ result:'data.frame':   1856 obs. of  2 variables:
  .. .. ..$ Time       : num [1:1856] 476 476 476 476 476 ...
  .. .. ..$ acc_mps2.ED: num [1:1856] -0.534 -0.534 -0.534 -0.534 -0.534 ...
  .. ..$ error : NULL
  [list output truncated]

Что мне нужно сделать

Столбец списка acc_mps2.Ed содержит список в каждой строке.Список содержит элементы result и error.Элемент result представляет собой фрейм данных, содержащий 2 столбца.Я хочу получить окончательный вывод со следующими столбцами:

file.ID2 LV      chunk_of_speed Time                   acc_mps2.ED  

По сути, я хочу избавиться от элемента error и объединить все столбцы списка data и acc_mps2.ED.

То, что я пробовал

Я прочитал очень много постов на блоге, но до сих пор не могу понять, как удалить элемент error и объединить столбцы.Я также пробовал разные функции purrr.Например:

> ds_mainline_nested_acc %>% transpose() %>% simplify_all() %>% compact() %>% unlist() %>% head()
$file.ID2
[1] "Cars_01"

$LV
[1] "WhiteC2"

$chunk_of_speed
[1] 1

$data.file.ID1
[1] "Cars_20160601_01.hdf5"

$data.file.ID2
[1] "Cars_20160601_01.hdf5"

$data.file.ID3
[1] "Cars_20160601_01.hdf5"

Очевидно, что результат отсутствует в выводе данных.Я также попробовал:

> ds_mainline_nested_acc %>% transpose() %>% simplify_all() %>% compact() %>% map_df(.$acc_mps2.ED)
Error: Can't convert NULL to function
Call `rlang::last_error()` to see a backtrace

Что мне не хватает?Разве compact() не должен удалять значения NULL?Подскажите, пожалуйста, какие функции я могу использовать для получения желаемого результата?

1 Ответ

1 голос
/ 27 апреля 2019

На самом деле это простое решение: сначала вы наносите на карту столбец acc_mps2.ED, чтобы выбрать только results. Затем вы сопоставляете этот столбец плюс столбец data с cbind ими, а затем удаляете столбец данных.

library(tidyverse)
ds_mainline_nested_acc  %>%
  mutate(
    acc_mps2.ED = pmap(
      ds_mainline_nested_acc  %>% 
        select("acc_mps2.ED", "data"),
      ~ bind_cols(..1$result, ..2))
  ) %>%
  select(-data)  

purrr * pmap позволяет вам перебирать несколько вещей одновременно (поэтому ..1 и ..2 фактически выбирают соответствующие столбцы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...