Добавить новые столбцы с помощью настраиваемой функции с помощью mutate

Я хочу сделать простой и добавить новый столбец, используя для этого dplyr mutate. В основном у меня есть DF с большим количеством столбцов, и я хочу выбрать некоторые из них, только те, которые содержат hist_avg, tgt_ и monthyl_X_ly. Это должно быть просто, и добавление нового столбца, начинающегося с метрики fct_ +, не должно быть проблемой. Однако, как вы можете видеть ниже, он добавляет столбец, но со странным именем (fct_visits $ hist_avg_visits и fct_revenue $ hist_avg_revenue_lcy).

Кроме того, не уверен, но я попытался сделать это с помощью mutate +, так как это сэкономило бы мне много строк кода и не мог понять, как это сделать.

library(tidyverse)

(example <- tibble(brand = c("Brand A", "Brand A", "Brand A", "Brand A", "Brand A"),
                     country = c("Country A", "Country A", "Country A", "Country A", "Country A"),
                     date = c("2020-08-01", "2020-08-02", "2020-08-03", "2020-08-04", "2020-08-05"),
                     visits = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_),
                     visits_ly = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), 
                     tgt_visits = c(2491306, 2491306, 2491306, 2491306, 2491306), 
                     hist_avg_visits = c(177185, 175758, 225311, 210871, 197405), 
                     monthly_visits_ly = c(3765612, 3765612, 3765612, 3765612, 3765612),
                     revenue_lcy = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_),
                     revenue_ly = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_),
                     tgt_revenue_lcy = c(48872737, 48872737, 48872737, 48872737, 48872737),
                     hist_avg_revenue_lcy = c(231101, 222236, 276497, 259775, 251167), 
                     monthly_revenue_lcy_ly = c(17838660, 17838660, 17838660, 17838660, 17838660))) %>% 
    print(width = Inf)
#> # A tibble: 5 x 13
#>   brand   country   date       visits visits_ly tgt_visits hist_avg_visits
#>   <chr>   <chr>     <chr>       <dbl>     <dbl>      <dbl>           <dbl>
#> 1 Brand A Country A 2020-08-01     NA        NA    2491306          177185
#> 2 Brand A Country A 2020-08-02     NA        NA    2491306          175758
#> 3 Brand A Country A 2020-08-03     NA        NA    2491306          225311
#> 4 Brand A Country A 2020-08-04     NA        NA    2491306          210871
#> 5 Brand A Country A 2020-08-05     NA        NA    2491306          197405
#>   monthly_visits_ly revenue_lcy revenue_ly tgt_revenue_lcy hist_avg_revenue_lcy
#>               <dbl>       <dbl>      <dbl>           <dbl>                <dbl>
#> 1           3765612          NA         NA        48872737               231101
#> 2           3765612          NA         NA        48872737               222236
#> 3           3765612          NA         NA        48872737               276497
#> 4           3765612          NA         NA        48872737               259775
#> 5           3765612          NA         NA        48872737               251167
#>   monthly_revenue_lcy_ly
#>                    <dbl>
#> 1               17838660
#> 2               17838660
#> 3               17838660
#> 4               17838660
#> 5               17838660

first_forecast <- function(dataset, metric) {
  avg_metric <- select(dataset, paste0("hist_avg_", metric))
  tgt_metric <- select(dataset, paste0("tgt_", metric))
  monthly_metric <- select(dataset, paste0("monthly_", metric, "_ly"))
  
  output <- avg_metric * (tgt_metric / monthly_metric)
  return(output)
  
}

example %>% 
  mutate(fct_visits = first_forecast(., "visits"),
         fct_revenue = first_forecast(., "revenue_lcy")) %>% 
  print(width = Inf)
#> # A tibble: 5 x 15
#>   brand   country   date       visits visits_ly tgt_visits hist_avg_visits
#>   <chr>   <chr>     <chr>       <dbl>     <dbl>      <dbl>           <dbl>
#> 1 Brand A Country A 2020-08-01     NA        NA    2491306          177185
#> 2 Brand A Country A 2020-08-02     NA        NA    2491306          175758
#> 3 Brand A Country A 2020-08-03     NA        NA    2491306          225311
#> 4 Brand A Country A 2020-08-04     NA        NA    2491306          210871
#> 5 Brand A Country A 2020-08-05     NA        NA    2491306          197405
#>   monthly_visits_ly revenue_lcy revenue_ly tgt_revenue_lcy hist_avg_revenue_lcy
#>               <dbl>       <dbl>      <dbl>           <dbl>                <dbl>
#> 1           3765612          NA         NA        48872737               231101
#> 2           3765612          NA         NA        48872737               222236
#> 3           3765612          NA         NA        48872737               276497
#> 4           3765612          NA         NA        48872737               259775
#> 5           3765612          NA         NA        48872737               251167
#>   monthly_revenue_lcy_ly fct_visits$hist_avg_visits
#>                    <dbl>                      <dbl>
#> 1               17838660                    117225.
#> 2               17838660                    116280.
#> 3               17838660                    149064.
#> 4               17838660                    139511.
#> 5               17838660                    130602.
#>   fct_revenue$hist_avg_revenue_lcy
#>                              <dbl>
#> 1                          633149.
#> 2                          608862.
#> 3                          757521.
#> 4                          711708.
#> 5                          688124.

Создано 28 июля 2020 г. пакетом REPEX (v0.3.0)

См. также:  Использование tbl_regression для многомерной регрессии во вложенных фреймах данных

Вы возвращаете кусочек своей функции. Вместо изменения используйте cbind   —  person Fernando Finotto    schedule 28.07.2020

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Fernando Finotto

    Указывая на отличное предложение @Onyambu, последняя часть вашего кода должна быть такой:

    example %>% 
      cbind(fct_visits = first_forecast(., "visits"),
             fct_revenue = first_forecast(., "revenue_lcy")) %>% 
      print(width = Inf)
    
    brand   country       date visits visits_ly tgt_visits hist_avg_visits monthly_visits_ly revenue_lcy
    1 Brand A Country A 2020-08-01     NA        NA    2491306          177185           3765612          NA
    2 Brand A Country A 2020-08-02     NA        NA    2491306          175758           3765612          NA
    3 Brand A Country A 2020-08-03     NA        NA    2491306          225311           3765612          NA
    4 Brand A Country A 2020-08-04     NA        NA    2491306          210871           3765612          NA
    5 Brand A Country A 2020-08-05     NA        NA    2491306          197405           3765612          NA
      revenue_ly tgt_revenue_lcy hist_avg_revenue_lcy monthly_revenue_lcy_ly hist_avg_visits hist_avg_revenue_lcy
    1         NA        48872737               231101               17838660        117224.5             633149.5
    2         NA        48872737               222236               17838660        116280.4             608862.0
    3         NA        48872737               276497               17838660        149064.4             757521.3
    4         NA        48872737               259775               17838660        139511.0             711707.9
    5         NA        48872737               251167               17838660        130601.9             688124.5
    

    Ткс Дак, но с cbind видимо не работает. Я пробовал использовать bind_cols из dplyr, но получаю имя столбца, например, hist_avg_visits … 70 person Fernando Finotto; 29.07.2020

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: