删除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
值?请指导我可以使用哪些功能来获得所需的输出?
答案 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
实际上选择了相应的列)