在purrr:map2和mutate中使用管道的问题。

问题描述 投票:0回答:1
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 "的列表列由数字变量组成。我想将它们乘以平减指数。(也就是根据通货膨胀进行调整)

这样就可以了

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内的管道,但还是...

请帮助:)谢谢!

r dplyr purrr data-wrangling
1个回答
2
投票

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

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

如果你想做 map2 里面 mutate当你对数据进行分组和嵌套后,你首先要做的是 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

事实上,你也可以省略 group_by()ungroup() 通过提供非嵌套列(在你的例子中。ano_fiscal)至 nest():

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

应该会得到和之前一样的结果。请注意,为了避免出现警告,你应该将该函数命名为 -Species 内的论点 nest().

© www.soinside.com 2019 - 2024. All rights reserved.