【问题标题】:Applying functions to nested dataframes with map使用地图将函数应用于嵌套数据框
【发布时间】:2017-01-12 16:10:22
【问题描述】:

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

> 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 这样的对象,所以这里有一个指向 wetransfer 上的 rds 的链接(如果允许的话):https://wetransfer.com/downloads/9697fff593f51c02136bc704adccbcc220170112161115/5be1fc

【问题讨论】:

    标签: r dictionary dplyr tidyr purrr


    【解决方案1】:

    您只需要先选择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"]])))
    

    【讨论】:

    • 我更喜欢第一个选项,因为它对我个人来说更清晰一些。我很久没有使用嵌套数据或映射了。 map_dbl 非常值得了解 - 我没有意识到我也可以在 map 上加上后缀
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2020-03-29
    相关资源
    最近更新 更多