函数和 Cbind 结果的多个变量值
Multiple Variable Values to Function and Cbind Results
这是此问题的延续:
我有一个数据集,我在其中使用了 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 函数在组合数据集中的行列表中向下移动。
这是我的尝试:
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。
希望这是有道理的。
如果您需要我提供更多信息,请告诉我。
谢谢!
当我们遍历 'combos' 的行时,创建一个 list
与 'combos' 的行数相同的 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)
}
然后遍历 'combos'
的行
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="_")))
将 data.frame
的 list
转换为具有 'id' 列的单个 data.frame 以指示组合
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
添加到@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))]
这是此问题的延续:
我有一个数据集,我在其中使用了 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 函数在组合数据集中的行列表中向下移动。
这是我的尝试:
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。
希望这是有道理的。
如果您需要我提供更多信息,请告诉我。
谢谢!
当我们遍历 'combos' 的行时,创建一个 list
与 'combos' 的行数相同的 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)
}
然后遍历 'combos'
的行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="_")))
将 data.frame
的 list
转换为具有 'id' 列的单个 data.frame 以指示组合
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
添加到@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))]