使用purrr从列表的列表中删除错误元素

时间:2019-04-26 17:34:09

标签: r purrr

目标

删除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列表列在每一行中包含一个列表。该列表包含resulterror元素。 result元素是一个包含2列的数据框。我想获得包含以下各列的最终输出:

file.ID2 LV      chunk_of_speed Time                   acc_mps2.ED  

本质上,我想摆脱error元素并合并dataacc_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 个答案:

答案 0 :(得分:1)

这实际上是一个简单的解决方案:首先,您在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的{​​{1}}允许您一次迭代多个内容(因此pmap..1实际上选择了相应的列)