我需要使用 Wilcoxon 符号秩和检验将每四行中的值与一个值(作为 mu)进行比较。例如,如果我的数据是这样的:
df1 <- c(0.205346764819837, 0.260927758796802, 0.243880102849495, 0.244549329012715,
0.122609277587968, 0.19381141911169, 0.0617801415941672, 0.217762671269064,
0.0513190799901377, 0.293455672572294, 0.222447254411609, 0.271001373674756,
0.00119756260786869, 0.119069423408827, -0.0164312634285513,
0.0446268183579303)
df2 <- c(0.23340509, 0.05959987, 0.17380963, 0.14517836)
我正在使用
wilcox.test
将 df1 中的四个值中的每一个与 df_stack2 中的一个值 mu 进行比较。考虑只有前四行的 df
wilcox.test(dfnew$A, mu=0.23340509)$p.value.
我意识到我可以通过使用每四行分组:
split(df, as.integer(gl(nrow(df) 4, nrow(df))))
我希望在 mapply 中采用它(因此我可以与 future.apply 并行化,因为我的数据框的实际大小),但是,我有点不确定如何指定每四行进行比较一个值(在单独的数据框中)为 mu?
您可以使用
rep()
创建您的组并按组应用您的功能:
library(data.table)
setDT(dfnew)[, grp:=rep(1:(.N/4), each=4, length.out=.N)]
dfnew[, .(pval = wilcox.test(A, mu=df2[.BY$grp])$p.value), grp]
输出:
grp pval
<int> <num>
1: 1 0.875
2: 2 0.125
3: 3 0.875
4: 4 0.125
类似地,使用
dplyr
:
dfnew %>%
group_by(grp = rep(1:(n()/4), each=4, length.out=n())) %>%
summarize(pval = wilcox.test(A,mu = df2[cur_group()$grp])$p.value)
输出:
grp pval
<int> <dbl>
1 1 0.875
2 2 0.125
3 3 0.875
4 4 0.125
您可能会发现另一种有趣的方法:
setDT(dfnew)[, .(pval = wilcox.test(A, mu=.BY$mu)$p.value), .(mu = rep(df2, each=4))]
输出:
mu pval
<num> <num>
1: 0.23340509 0.875
2: 0.05959987 0.125
3: 0.17380963 0.875
4: 0.14517836 0.125
您可以创建一个包含 4 个元素的列表,其中列表的每个元素包含
df1
的每四个值。然后使用来自 map2()
包或 purrr
系列的 tidyverse()
,您可以为拆分列表的每个块提供来自 mu
的相应 df2
:
library(tidyverse)
# split df1 into 4 chunks of size 4 (or 4 elements of size 4)
df1split <- split(df1, ceiling(seq_along(df1) / 4))
#calculate wilcoxon test for each chunk using map2()
map2(df1split,df2, ~ wilcox.test(.x, mu =.y)$p.value)
$`1`
[1] 0.875 # pvalue of first chunk
$`2`
[1] 0.125 # pvalue of second chunk
$`3`
[1] 0.875 # pvalue of third chunk
$`4`
[1] 0.125 # pvalue of fourth chunk
要将
p-values
从列表返回到数据框中,您可以将以下代码添加到 map2()
:
map2(df1split,df2, ~ wilcox.test(.x, mu =.y)$p.value) %>%
bind_rows() %>% t() %>% as.data.frame() %>%
rename("p-value" = "V1")
p-value
1 0.875
2 0.125
3 0.875
4 0.125
另一个库的另一种方法:
library(matrixTests)
# turn each 4-observation entry into a separate row in a matrix:
m1 <- matrix(df1, ncol=4, byrow=TRUE)
# perform the test:
row_wilcoxon_onesample(m1, df2)
obs statistic pvalue location.null alternative exact corrected
1 4 6 0.875 0.23340509 two.sided TRUE FALSE
2 4 10 0.125 0.05959987 two.sided TRUE FALSE
3 4 6 0.875 0.17380963 two.sided TRUE FALSE
4 4 0 0.125 0.14517836 two.sided TRUE FALSE