哪个是适用于两个数字矩阵的权利?

时间:2013-12-22 17:47:50

标签: r apply

假设我有一个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)

这甚至可能吗?

5 个答案:

答案 0 :(得分:5)

1)mapply 试试这个。 dt_xy中的每一个转换为原始行的数据框,该数据框也是允许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 pagefn的信息以及package documentation中的更多信息

library(gsubfn) # fn
conf.int.1a <- t(fn$mapply(~ t.test(x, y)$conf.int, dt_(x), dt_(y)))

2)应用另一种方法是从xy创建一个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))

或者(可能效率稍低)您可以将xy转换为列表并使用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))))