假设我有1000个x观测值的向量,以及1000个观测值的向量y.每行x和每行y分别对应100个样本.
x <- t(replicate(1000, rnorm(100,mean=6)))
y <- t(replicate(1000, rnorm(100,mean=5)))
Run Code Online (Sandbox Code Playgroud)
我想进行一次测试,看看每行的平均值是否与每一行的平均值有x显着差异y.
哪个是apply在这种情况下使用的权利?理想情况下,它会是这样的:
Xapply(x,y, function(x,y) t.test(x,y)$conf.int)
Run Code Online (Sandbox Code Playgroud)
这甚至可能吗?
1)mapply尝试这个.dt_将每个的x和y成原始行的数据帧,这也是原始行允许的列表mapply将被直接使用.t根据所需的输出方向,您可能希望也可能不希望显示外部:
dt_ <- function(x) data.frame(t(x))
conf.int.1 <- t(mapply(function(x, y) t.test(x, y)$conf.int, dt_(x), dt_(y)))
Run Code Online (Sandbox Code Playgroud)
1a)使用函数的公式表示法略微缩短变化.见信息上fn的上gsubfn主页和在包文档更多
library(gsubfn) # fn
conf.int.1a <- t(fn$mapply(~ t.test(x, y)$conf.int, dt_(x), dt_(y)))
Run Code Online (Sandbox Code Playgroud)
2)应用的另一种方法是从创建3D阵列x和y并然后在第一dimenstion申请t检验:
z <- array(c(x, y), c(dim(x), 2))
conf.int.2 <- t(apply(z, 1, function(x) t.test(x[, 1], x[, 2])$conf.int))
Run Code Online (Sandbox Code Playgroud)
2a)可以abind在abind包中使用一种更好的创建3d数组的方法:
library(abind)
a <- abind(x, y, along = 3)
conf.int.2a <- t(apply(a, 1, function(x) t.test(x[, 1], x[, 2])$conf.int))
Run Code Online (Sandbox Code Playgroud)
更新:添加解决方案2.
更新:添加解决方案2a.