使用map将函数应用于嵌套数据帧

时间:2017-01-12 16:10:23

标签: r dictionary dplyr tidyr purrr

我遇到嵌套和映射问题,我不知道如何解决。我有一个嵌套数据帧的元素,如下所示:

> x
# A tibble: 18 × 3
   event.no               data dr.dur
      <dbl>             <list>  <int>
1         1   <tibble [7 × 4]>      7
2         4 <tibble [123 × 4]>    123
3         5   <tibble [9 × 4]>      9
4         7  <tibble [14 × 4]>     14
5        10  <tibble [19 × 4]>     19
6        11 <tibble [220 × 4]>    220
7        12 <tibble [253 × 4]>    253
8        14 <tibble [153 × 4]>    153
9        15  <tibble [28 × 4]>     28
10       17 <tibble [169 × 4]>    169
11       18   <tibble [7 × 4]>      7
12       19 <tibble [115 × 4]>    115
13       21 <tibble [109 × 4]>    109
14       25  <tibble [13 × 4]>     13
15       26 <tibble [249 × 4]>    249
16       28   <tibble [7 × 4]>      7
17       30  <tibble [26 × 4]>     26
18       31  <tibble [12 × 4]>     12
>
> x$data[[1]]
# A tibble: 7 × 4
  discharge threshold def.increase event.orig
      <dbl>     <dbl>        <dbl>      <dbl>
1     0.348     0.373       2160.0          1
2     0.348     0.373       2160.0          1
3     0.379     0.373       -518.4          0
4     0.379     0.373       -518.4          0
5     0.379     0.373       -518.4          0
6     0.379     0.373       -518.4          0
7     0.348     0.373       2160.0          2
> 

我需要在每个嵌套数据帧中找到def.increase列的总和。我现在不确定最好的方法,这就是我一直在努力的方法:

> x %>%
+   mutate(dr.def = map(data, colSums)) %>%
+   unnest(dr.def)
# A tibble: 72 × 3
   event.no dr.dur    dr.def
      <dbl>  <int>     <dbl>
1         1      7     2.560
2         1      7     2.611
3         1      7  4406.400
4         1      7     4.000
5         4    123    45.739
6         4    123    45.879
7         4    123 12096.000
8         4    123   530.000
9         5      9     3.269
10        5      9     3.357
# ... with 62 more rows

显然,这个问题是我最终得到了每一列的总和。这样可以,但之后只选择我想要的行会变得非常混乱。有没有更好的方法来查找每个def.increase列的列总和?谢谢你的帮助:)

编辑:不确定我是否可以复制/粘贴像x这样的对象,所以这里有一个指向湿转移的rds的链接(如果允许的话):https://wetransfer.com/downloads/9697fff593f51c02136bc704adccbcc220170112161115/5be1fc

1 个答案:

答案 0 :(得分:3)

您只需先选择def.increase列:

library(tidyverse)

x %>% 
  mutate(dr.def = map(data, "def.increase") %>% map_dbl(sum))

或者只使用一张地图:

x %>% 
  mutate(dr.def = map_dbl(data, ~ sum(.x[["def.increase"]])))