purrr:map2 内的管道问题和变异

Problem with pipe within purrr:map2 and mutate

nested_numeric <- model_table %>%
   group_by(ano_fiscal) %>%
   select(-c("ano_estudo", "payout", "div_ratio","ebitda", "name.company",
             "alavancagem","div_pl", "div_liq", "div_total")) %>%
   nest()

nested_numeric
# A tibble: 7 x 2
# Groups:   ano_fiscal [7]
  ano_fiscal data              
       <dbl> <list>            
1       2012 <tibble [34 x 10]>
2       2013 <tibble [35 x 10]>
3       2014 <tibble [35 x 10]>
4       2015 <tibble [35 x 10]>
5       2016 <tibble [35 x 10]>
6       2017 <tibble [35 x 10]>
7       2018 <tibble [35 x 10]>

df_ipca$idx
[1] 0.9652515 0.9741318 0.9817300 0.9911546 0.9941281 0.9985022 1.0000000

名为 "data" 的列表列由数字变量组成。我想将它们相乘以获得平减指数。 (a.k.a。调整 inflation)

这个很好用

map2_df(nested_numeric$data, df_ipca$idx, ~ .x * .y)

甚至

map2(nested_numeric$data, df_ipca$idx, ~ .x * .y)

但我正在尝试使用此操作的结果创建一个名为 "adjusted_data" 的新列表列:

nested_numeric <- model_table %>%
    group_by(ano_fiscal) %>%
    select(-c("ano_estudo", "payout", "div_ratio","ebitda", "name.company",
              "alavancagem","div_pl", "div_liq", "div_total")) %>%
    nest() %>%
    mutate( adjusted_data = data %>% {
    map2(., df_ipca$idx, ~ .x * .y)})

给我这个错误:

Error: Column `adjusted_data` must be length 1 (the group size), not 7

我希望我的问题足够清楚,因为我正在尝试调整 inflation 具有按年嵌套值的数据框。 我认为在 mutate 中使用 map2 就足够了……我已经尝试了所有方法,但无法弄清楚我做错了什么。 我在这里读过关于 map2 中管道的类似问题,但仍然...

请帮忙:) 谢谢!

一个简单的解决方案(但是会破坏你的管道)就是这样做

nested_numeric$adjusted_data <- map2(nested_numeric$data, df_ipca$idx, ~ .x * .y)

例如,使用iris数据:

library(tidyverse)

df_ipca <- data.frame(idx = runif(3))

iris <- iris %>% 
  group_by(Species) %>% 
  nest()

iris$adjusted_data <- map2(iris$data, df_ipca$idx, ~.x * .y)
iris
#> # A tibble: 3 x 3
#> # Groups:   Species [3]
#>   Species    data              adjusted_data    
#>   <fct>      <list>            <list>           
#> 1 setosa     <tibble [50 × 4]> <df[,4] [50 × 4]>
#> 2 versicolor <tibble [50 × 4]> <df[,4] [50 × 4]>
#> 3 virginica  <tibble [50 × 4]> <df[,4] [50 × 4]>

使用 mutate

的解决方案

如果要在 mutate 中执行 map2,在对数据进行分组和嵌套之后,首先必须 ungroup() 在调用 mutate 之前(我否则认为 mutate 将尝试在每个组内执行操作,而不是遍历整个 data 列,这正是您想要的):

nested_numeric %>%
  ungroup() %>%
  mutate(
    adjusted_data = map2(data, df_ipca$idx, ~ .x * .y)
  )

例如,使用iris数据:

library(tidyverse)

df_ipca <- data.frame(idx = runif(3))

iris_nested <- iris %>% 
  group_by(Species) %>% 
  nest() %>% 
  ungroup() %>% 
  mutate(
    adjusted_data = map2(data, df_ipca$idx, ~ .x * .y)
  )

# Original data
map(iris_nested$data, head)
#> [[1]]
#> # A tibble: 6 x 4
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width
#>          <dbl>       <dbl>        <dbl>       <dbl>
#> 1          5.1         3.5          1.4         0.2
#> 2          4.9         3            1.4         0.2
#> 3          4.7         3.2          1.3         0.2
#> 4          4.6         3.1          1.5         0.2
#> 5          5           3.6          1.4         0.2
#> 6          5.4         3.9          1.7         0.4
#> 
#> [[2]]
#> # A tibble: 6 x 4
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width
#>          <dbl>       <dbl>        <dbl>       <dbl>
#> 1          7           3.2          4.7         1.4
#> 2          6.4         3.2          4.5         1.5
#> 3          6.9         3.1          4.9         1.5
#> 4          5.5         2.3          4           1.3
#> 5          6.5         2.8          4.6         1.5
#> 6          5.7         2.8          4.5         1.3
#> 
#> [[3]]
#> # A tibble: 6 x 4
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width
#>          <dbl>       <dbl>        <dbl>       <dbl>
#> 1          6.3         3.3          6           2.5
#> 2          5.8         2.7          5.1         1.9
#> 3          7.1         3            5.9         2.1
#> 4          6.3         2.9          5.6         1.8
#> 5          6.5         3            5.8         2.2
#> 6          7.6         3            6.6         2.1
# Adjusted data
map(iris_nested$adjusted_data, head)
#> [[1]]
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width
#> 1    1.0206142   0.7004215    0.2801686  0.04002409
#> 2    0.9805901   0.6003613    0.2801686  0.04002409
#> 3    0.9405660   0.6403854    0.2601566  0.04002409
#> 4    0.9205540   0.6203733    0.3001807  0.04002409
#> 5    1.0006022   0.7204336    0.2801686  0.04002409
#> 6    1.0806503   0.7804697    0.3402047  0.08004817
#> 
#> [[2]]
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width
#> 1    0.3256959   0.1488896    0.2186816  0.06513919
#> 2    0.2977791   0.1488896    0.2093760  0.06979199
#> 3    0.3210431   0.1442368    0.2279872  0.06979199
#> 4    0.2559039   0.1070144    0.1861120  0.06048639
#> 5    0.3024319   0.1302784    0.2140288  0.06979199
#> 6    0.2652095   0.1302784    0.2093760  0.06048639
#> 
#> [[3]]
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width
#> 1     2.399749    1.257011     2.285475   0.9522814
#> 2     2.209293    1.028464     1.942654   0.7237339
#> 3     2.704479    1.142738     2.247384   0.7999164
#> 4     2.399749    1.104646     2.133110   0.6856426
#> 5     2.475932    1.142738     2.209293   0.8380076
#> 6     2.894935    1.142738     2.514023   0.7999164

事实上,您还可以通过向 nest() 提供非嵌套列(在您的情况下为 ano_fiscal)来省略 group_by()ungroup() 调用:

iris %>% 
  nest(data = -Species) %>% 
  mutate(
    adjusted_data = map2(data, df_ipca$idx, ~ .x * .y)
  )

这应该会给出与之前相同的结果。请注意,为避免出现警告,您应该在 nest().

中命名 -Species 参数