R - 距离计算循环遍历时间序列上的数据帧行
R - Distance calculation looping through data frame rows on a time series
刚开始使用 R 并未能找到修复方法,已阅读多个答案但未找到合适的答案。我正在尝试计算并使用相关性作为一堆商店之间的距离度量,因此想出跟踪 - 控制配对,然后评估营销活动是否对 post 销售产生重大影响。
营销活动前的总销售量是我感兴趣的指标,我已经为每家商店提供了七个月的销售量,我想遍历所有这些以找到更适合每个月的试用-控制配对。三个是营销活动(试用)的商店对象,也是 运行 三个月,因此,有必要找到一个好的试用 - 控制每个月的商店匹配。
到目前为止,这是我想出的方法,它似乎有效,但是,我还没有理解如何以方便的格式存储结果,我随后可以使用它来评估最高试验的位置 - 控制存储相关性是每个月:
my.fun <- function(trial){
for (store in st.vector) {
trial <- stores_stats_pre %>% filter(store_nbr == trial) %>% select(total_sales)
control <- stores_stats_pre %>% filter(store_nbr == store) %>% select(total_sales)
cor(control$total_sales, trial$total_sales)
}
}
然后我会简单地将它用作 my.fun(trial_store_number)
st.vector
包含商店的唯一 ID(删除了试用商店以避免计算与它们自己的相关性)
trial_stores <- c(77, 86, 88)
st.vector <- unique(stores_stats_pre$store_nbr)
st.vector <- st.vector[!st.vector %in% trial_stores]
store_stats_pre
是一个数据框,包含总共 260 家商店的一系列营销活动前指标(我只包括前两个):
store_stats_pre <- data.frame(
store_nbr=c(1,1,1,1,1,1,1,2,2,2,2,2,2,2),
year_month=c('2018-07', '2018-08', '2018-09', '2018-10', '2018-11', '2018-12', '2019-01','2018-07', '2018-08', '2018-09', '2018-10', '2018-11', '2018-12', '2019-01'),
total_sales=c(206, 176, 278, 188, 192, 189, 154, 150, 193, 155, 168, 163, 136, 159))
我尝试在循环外创建一个空数据框,但是,我无法理解如何 append/store 将关联和相关控制存储编号放入其中。理想情况下,它看起来像这样:
results_dataframe <- data.frame(
Control_nbr = c(1,2,3, etc.),
Correlation = c(correlation_vs_trial_store)
)
我会这样修改我的代码:
results_dataframe <- data.frame(Control_nbr = integer(0), Correlation = integer(0))
my.fun <- function(trial){
for (store in st.vector) {
trial <- stores_stats_pre %>% filter(store_nbr == trial) %>% select(total_sales)
control <- stores_stats_pre %>% filter(store_nbr == store) %>% select(total_sales)
correlation <- cor(control$total_sales, trial$total_sales)
results_dataframe[Control_nbr] <- store
results_dataframe[Correlation] <- correlation
}
}
但它不起作用,我还收到“cor(control$total_sales, trial$total_sales) 错误:
尺寸不兼容”消息。
另外,我读到在循环内增长对象是一种不好的做法,因此,我不确定我应该怎么做。
谢谢
这就是你想要的吗?我创建了新的测试数据,因为你没有足够的数据来处理或测试数据中的试用存储。
只有当您在试验中的商店数量与控制中的数量相同(如您问题的评论中所述)时,这才有效。
library(tidyverse)
stores_stats_pre <- data.frame(
store_nbr = sort(rep(seq(1:10),7)),
year_month= rep(c('2018-07', '2018-08', '2018-09', '2018-10', '2018-11', '2018-12', '2019-01'), 10),
total_sales= sample(100:200, 70))
trial_stores <- list(c(1:5), c(1, 2, 4, 8, 9), c(4:8)) %>%
set_names()
corr_function <- function(x){
trial <- stores_stats_pre %>%
filter(store_nbr %in% x) %>% # stores in x
pull(total_sales)
control <- stores_stats_pre %>%
filter(!store_nbr %in% x) %>% # stores not in x
pull(total_sales)
cor(trial, control)
}
map_df(trial_stores, ~(corr_function(.x)), .id = "trial stores") %>%
pivot_longer(everything())
# A tibble: 3 x 2
name value
<chr> <dbl>
1 1:5 -0.219
2 c(1, 2, 4, 8, 9) -0.133
3 4:8 -0.0656
刚开始使用 R 并未能找到修复方法,已阅读多个答案但未找到合适的答案。我正在尝试计算并使用相关性作为一堆商店之间的距离度量,因此想出跟踪 - 控制配对,然后评估营销活动是否对 post 销售产生重大影响。
营销活动前的总销售量是我感兴趣的指标,我已经为每家商店提供了七个月的销售量,我想遍历所有这些以找到更适合每个月的试用-控制配对。三个是营销活动(试用)的商店对象,也是 运行 三个月,因此,有必要找到一个好的试用 - 控制每个月的商店匹配。
到目前为止,这是我想出的方法,它似乎有效,但是,我还没有理解如何以方便的格式存储结果,我随后可以使用它来评估最高试验的位置 - 控制存储相关性是每个月:
my.fun <- function(trial){
for (store in st.vector) {
trial <- stores_stats_pre %>% filter(store_nbr == trial) %>% select(total_sales)
control <- stores_stats_pre %>% filter(store_nbr == store) %>% select(total_sales)
cor(control$total_sales, trial$total_sales)
}
}
然后我会简单地将它用作 my.fun(trial_store_number)
st.vector
包含商店的唯一 ID(删除了试用商店以避免计算与它们自己的相关性)
trial_stores <- c(77, 86, 88)
st.vector <- unique(stores_stats_pre$store_nbr)
st.vector <- st.vector[!st.vector %in% trial_stores]
store_stats_pre
是一个数据框,包含总共 260 家商店的一系列营销活动前指标(我只包括前两个):
store_stats_pre <- data.frame(
store_nbr=c(1,1,1,1,1,1,1,2,2,2,2,2,2,2),
year_month=c('2018-07', '2018-08', '2018-09', '2018-10', '2018-11', '2018-12', '2019-01','2018-07', '2018-08', '2018-09', '2018-10', '2018-11', '2018-12', '2019-01'),
total_sales=c(206, 176, 278, 188, 192, 189, 154, 150, 193, 155, 168, 163, 136, 159))
我尝试在循环外创建一个空数据框,但是,我无法理解如何 append/store 将关联和相关控制存储编号放入其中。理想情况下,它看起来像这样:
results_dataframe <- data.frame(
Control_nbr = c(1,2,3, etc.),
Correlation = c(correlation_vs_trial_store)
)
我会这样修改我的代码:
results_dataframe <- data.frame(Control_nbr = integer(0), Correlation = integer(0))
my.fun <- function(trial){
for (store in st.vector) {
trial <- stores_stats_pre %>% filter(store_nbr == trial) %>% select(total_sales)
control <- stores_stats_pre %>% filter(store_nbr == store) %>% select(total_sales)
correlation <- cor(control$total_sales, trial$total_sales)
results_dataframe[Control_nbr] <- store
results_dataframe[Correlation] <- correlation
}
}
但它不起作用,我还收到“cor(control$total_sales, trial$total_sales) 错误: 尺寸不兼容”消息。
另外,我读到在循环内增长对象是一种不好的做法,因此,我不确定我应该怎么做。
谢谢
这就是你想要的吗?我创建了新的测试数据,因为你没有足够的数据来处理或测试数据中的试用存储。
只有当您在试验中的商店数量与控制中的数量相同(如您问题的评论中所述)时,这才有效。
library(tidyverse)
stores_stats_pre <- data.frame(
store_nbr = sort(rep(seq(1:10),7)),
year_month= rep(c('2018-07', '2018-08', '2018-09', '2018-10', '2018-11', '2018-12', '2019-01'), 10),
total_sales= sample(100:200, 70))
trial_stores <- list(c(1:5), c(1, 2, 4, 8, 9), c(4:8)) %>%
set_names()
corr_function <- function(x){
trial <- stores_stats_pre %>%
filter(store_nbr %in% x) %>% # stores in x
pull(total_sales)
control <- stores_stats_pre %>%
filter(!store_nbr %in% x) %>% # stores not in x
pull(total_sales)
cor(trial, control)
}
map_df(trial_stores, ~(corr_function(.x)), .id = "trial stores") %>%
pivot_longer(everything())
# A tibble: 3 x 2
name value
<chr> <dbl>
1 1:5 -0.219
2 c(1, 2, 4, 8, 9) -0.133
3 4:8 -0.0656