假设我有一个1000 x
个观测值的向量,以及一个1000 y
个观测值的向量。每行x
和每行y
分别对应100个样本。
x <- t(replicate(1000, rnorm(100,mean=6)))
y <- t(replicate(1000, rnorm(100,mean=5)))
我想进行一次t.test,看看每一行x
的平均值是否与y
每一行的平均值有显着差异。
在此上下文中使用哪个apply
?理想情况下,它会是这样的:
Xapply(x,y, function(x,y) t.test(x,y)$conf.int)
这甚至可能吗?
答案 0 :(得分:5)
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)))
1a)使用函数的公式表示法略微缩短变化。请参阅gsubfn home page上fn
的信息以及package documentation中的更多信息
library(gsubfn) # fn
conf.int.1a <- t(fn$mapply(~ t.test(x, y)$conf.int, dt_(x), dt_(y)))
2)应用另一种方法是从x
和y
创建一个3d数组,然后在第一个维度上应用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))
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))
更新:添加解决方案2.
更新:添加了解决方案2a。
答案 1 :(得分:2)
一种方法是将它们绑定并对较大的对象运行普通的应用程序:
apply( cbind(x,y), 1 , function(x) t.test(x[1:100], x[101:200] )$conf.int)
答案 2 :(得分:2)
您可以合并两个矩阵并为t.test
中使用的公式创建因子向量:
fac <- gl(2, ncol(x)) # factor
apply(cbind(x, y), 1, function(x) t.test(x ~ fac)$conf.int)
答案 3 :(得分:1)
set.seed(101)
x <- t(replicate(1000, rnorm(100,mean=6)))
y <- t(replicate(1000, rnorm(100,mean=5)))
这里的for
循环实际上很好,但你可以在索引上使用sapply
:
result <- t(sapply(seq(nrow(x)),
function(i) t.test(x[i,],y[i,])$conf.int))
或者(可能效率稍低)您可以将x
和y
转换为列表并使用mapply
:
xList <- split(x,row(x))
yList <- split(y,row(y))
m1 <- mapply(t.test,xList,yList,SIMPLIFY=FALSE)
result2 <- t(sapply(m1,"[[","conf.int"))
答案 4 :(得分:1)
我会使用mapply
:
t(mapply(function(i,j)t.test(x[i,],y[j,])$conf.int,
seq(nrow(x)),seq(nrow(y))))