生成行组合,然后将函数应用于每一行的值

generate row combinations then apply a function to each row's values

我有一个数据框,我的目标是获取排名列的所有可能组合,并为每个排名组合应用一个将使用 volume_metric 和 kpi_metric 值的函数。生成的输出将是一个矩阵,就像 cor() 函数提供的一样,除了每个等级组合 p 值。

基本上我想取 volume_metric & kpi_metric 的第一行值,然后取 volume_metric & kpi_metric 的第二行值并应用 zTest 对他们起作用。然后1->3、1->4等

rank <- c('ad 1', 'ad 2', 'ad 3', 'ad 4', 'ad 5', 'ad 6', 'ad 7', 'ad 8')
volume_metric <- c(12321, 12321, 1232121, 4343, 14333, 52323, 234532, 2322)
kpi_metric <- c(12, 32, 111, 334, 653, 343, 232, 212)
# The df
df <- tibble(rank, volume_metric, kpi_metric)

# A tibble: 8 x 3
   rank volume_metric kpi_metric
     <chr>         <dbl>      <dbl>
1     ad 1         12321         12
2     ad 2         12321         32
3     ad 3       1232121        111
4     ad 4          4343        334
5     ad 5         14333        653
6     ad 6         52323        343
7     ad 7        234532        232
8     ad 8          2322        212

# z-test fucntion
zTest <- function(volume1, volume2, kpi1, kpi2) {
  z_test <- prop.test(
    x=c(kpi1, kpi2),
    n=c(volume1, volume2),
    alternative = "greater",
    conf.level = 0.95,
    correct = FALSE
  )
  p_value <- z_test$p.value
  return(p_value)
}

到目前为止,我已经能够使用

获得所有排名组合
possible_combinations <- combn(nrow(df), 2)

这将提供一个包含所有组合的矩阵(排名将始终与 now(df) 相同)。

我试图遍历该矩阵,然后对 df 进行子集化,但这导致了一个永无止境的循环 ‍♂️。

我的问题是,我如何使用带有组合的矩阵来对我的 df 进行索引并应用 zTest 函数,还是我的想法全错了?

combn 接受一个函数,因此您可以将行号值传递给它们,并将 volume_metrickpi_metric 来自 df 的特定子集传递给 zTest函数。

zTest <- function(volume, kpi) {
  z_test <- prop.test(
    x=kpi,
    n=volume,
    alternative = "greater",
    conf.level = 0.95,
    correct = FALSE
  )
  p_value <- z_test$p.value
  return(p_value)
}

do.call(rbind, combn(nrow(df), 2, function(x) 
       data.frame(row1 = x[1], row2 = x[2], 
                  cor = zTest(df$volume_metric[x], df$kpi_metric[x])), 
       simplify = FALSE))

#   row1 row2        cor
#1     1    2  9.987e-01
#2     1    3  4.628e-23
#3     1    4  1.000e+00
#4     1    5  1.000e+00
#5     1    6  1.000e+00
#6     1    7  5.209e-01
#7     1    8  1.000e+00
#...