Несколько переменных значений для результатов функции и привязки - PullRequest
0 голосов
/ 09 мая 2018

Это продолжение этого вопроса здесь: For-Loop By Columns с существующим For-loop by Rows

У меня есть набор данных, в котором я использую 3 переменные: adstock_rate, diminishing_rate и lag_number , В настоящее время они установлены только на 1 номер.

В настоящее время я использую следующие номера:

adstock_rate<-0.5
lag_number<-1
diminishing_rate<-0.6

Окончательный вывод - это набор данных с новыми столбцами, присоединенными к существующему набору данных с использованием функции, приведенной ниже.

foo1 <- function(dot, lag_val = 1) {
     tmp <- dot
     for(i in (1 + lag_val): length(tmp)) {
           tmp[i] <- tmp[i] + adstock_rate * diminishing_rate * tmp[i - lag_val]
     }
     return(tmp)
   }


advertising_dataset %>%
       group_by(Region) %>%
       mutate_all(funs(adstocked = foo1(., lag_val = lag_number)))

Вот что я пытаюсь сделать:

Я хочу применить эту функцию к различным значениям этих переменных. Ниже приведены комбинации этих переменных:

adstock_rate = c(0.50, 0.60, 0.70)
lag_number = c(0,1)
diminishing_rate = c(0.50, 0.60)

combos<-expand.grid(adstock_rate,lag_number,diminishing_rate)
colnames(combos)[1]<-"AdStock_Rate"
colnames(combos)[2]<-"Lag_Number"
colnames(combos)[3]<-"Diminish_Rate"


head(combos)

   AdStock_Rate Lag_Number Diminish_Rate
1           0.5          0           0.5
2           0.6          0           0.5
3           0.7          0           0.5
4           0.5          1           0.5
5           0.6          1           0.5
6           0.7          1           0.5
7           0.5          0           0.6
8           0.6          0           0.6
9           0.7          0           0.6
10          0.5          1           0.6

Я думаю, вам нужно было бы создать цикл for или использовать функцию apply, чтобы перейти вниз по списку строк в наборе данных combos.

Вот моя попытка:

for(j in combos){
foo1 <- function(dot, lag_val = 1) {
     tmp <- dot
     for(i in (1 + lag_val): length(tmp)) {
           tmp[i] <- tmp[i] + combos[j,1] * combos[j,3] * tmp[i - lag_val]
     }
     return(tmp)
   }


advertising_dataset %>%
       group_by(Region) %>%
       mutate_all(funs(adstocked = foo1(., lag_val = combos[j,2])))

##cbind to previous output
}

Мне также нужно, чтобы имена столбцов имели числовые значения, такие как adstock_0.5_1_0.6, где 0,5 = коэффициент запаса, 1 = число отставаний и уменьшение = 0,6.

Надеюсь, это имеет смысл.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Добавить к ответу @ akrun. Если бы мы хотели, чтобы это было в форме столбца, это то, как вы бы это сделали. @akrun, если ты думаешь, что есть лучший способ, дай мне знать:

test<-out %>%
  gather(var, value, -(id:Region)) %>%
  unite(var, var, id, sep="_") %>%
  spread(var, value)
colnames(test)
colnames(test) = gsub("_adstock_", "+", colnames(test))
colnames(test) = gsub("^(?!.*adstocked)([^+]*)\\+.*","\\1", colnames(test), perl=TRUE)

non_dupe<-test[!duplicated(as.list(test))]
0 голосов
/ 09 мая 2018

Поскольку мы циклически перебираем строки «комбо», создаем list с тем же length, что и количество строк «комбо», для хранения вывода из цикла for

lst <- vector("list", nrow(combos)) # initialize a list to store output

Добавьте еще несколько параметров в 'foo1' для большей гибкости

foo1 <- function(dot, lag_val = 1, combos, ind) {
     tmp <- dot
     for(i in (1 + lag_val): length(tmp)) {
           tmp[i] <- tmp[i] + combos[ind,1] * combos[ind,3] * tmp[i - lag_val]
     }
     return(tmp)
   }

, а затем цикл по строкам 'комбо'

for(j in seq_len(nrow(combos))){

# assign the group by recursive output to each `list` element        


lst[[j]] <- advertising_dataset %>%
             group_by(Region) %>%
             mutate_all(funs(adstocked =
               foo1(., lag_val = combos[j,2], combos, ind = j)))

}
lst

Не ясно, нужно ли нам list имена быть "adstock_Rate_Number_Drate" или нет. Если это тот случай,

names(lst) <- paste0("adstock_", do.call(paste, c(combos, sep="_")))

Преобразование list из data.frame в один data.frame, имеющий столбец 'id', чтобы указать комбинацию

out <- bind_rows(lst, .id = 'id')
head(out, 3)
# A tibble: 3 x 6
# Groups:   Region [1]
#  id        Region advertising advertising2 advertising_adst… advertising2_ads…
#  <chr>      <dbl>       <dbl>        <dbl>             <dbl>             <dbl>
#1 adstock_…    500        118.         43.9              147.              54.9
#2 adstock_…    500        120.        231.               150.             289. 
#3 adstock_…    500        126.         76.8              157.              96.0
...