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