繁体   English   中英

pipe 在 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

名为“数据”的列表列由数字变量组成。 我想将它们相乘以获得通货紧缩指数。 (又名通货膨胀调整)

这很好用

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

我希望我的问题足够清楚,因为我正在尝试根据通货膨胀调整数据框,其值按年嵌套。 我认为在 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 ,在你分组和嵌套你的数据之后,你首先必须在调用mutate之前ungroup() (我认为否则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参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM