生成行组合,然后将函数应用于每一行的值
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_metric
和 kpi_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
#...
我有一个数据框,我的目标是获取排名列的所有可能组合,并为每个排名组合应用一个将使用 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_metric
和 kpi_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
#...