功能和Cbind结果的多个变量值

时间:2018-05-09 14:57:42

标签: r for-loop cbind

这是这个问题的延续: For-Loop By Columns with existing For-loop by Rows

我有一个数据集,其中我使用了3个变量: adstock_ratediminishing_ratelag_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函数向下查看组合数据集中的行列表。

这是我的尝试:

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 :(得分:1)

当我们循环播放“组合”行时,创建一个与{&#39;组合&#39行数相同list的{​​{1}} ;用于存储length循环

的输出
for

在&#39; foo1&#39;中添加更多参数。更灵活

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

然后遍历&#39;组合&#39;

的行
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 名称为adstock_Rate_Number_Drate&#39;或不。如果是这种情况,

list

names(lst) <- paste0("adstock_", do.call(paste, c(combos, sep="_"))) 的{​​{1}}转换为具有&#39; id&#39;的单个data.frame列表示组合

list

答案 1 :(得分:1)

添加@ 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))]