2013-03-04 92 views
1

我有一个大的矩阵。目标是要认识到具有所有相同的值的所有行的1,2-柱和3,并计算在对每个组行的第4列的0的百分比。把所有这个百分比放在一个称为“数据”的向量中。然后我需要三个向量(每列(最后一列除外)),它记录列的公共值。分别为“因子1”,“因子2”和“factor3”为列1,2和3 由于我的矩阵很大,很多,我需要的东西快速,高效的计算:我们把这些载体。R,有效的方式,矩阵运算

例如我有这样的矩阵:我们1和4(基于相等的值在列1,2和3)

[,1][,2][,3][,4] 
[1,] 1 1 1 0 
[2,] 1 2 1 0 
[3,] 3 2 1 0.6 
[4,] 1 1 1 0.2 
[5,] 1 2 1 0 
[6,] 1 1 2 0.1 
[7,] 3 2 1 0.9 

在这里组一起行和计算的0的百分比(在第4栏)(%零等于0.5)

然后我们组的行2和5,并再计算%零(等于1)

然后我们组的行3和7,并计算%为零(等于0)

然后第6行是单独及其%零(等于0)

这里是我想要得到的载体:

> data = c(0.5,1,0,0) 

> factor1 = c(1,1,3,1) 

> factor2 = c(1,2,2,1) 

> factor3 = c(1,1,1,2) 

这些值的顺序并不重要。如果在向量中的值0.5“数据”是在2位,使得所有的因素2的位置应为1。

目标是然后运行以下AOV:

> aov(data ~ factor1 * factor2 * factor3) 

由于一个非常感谢你的帮助

+0

哦,你真的想factorx是'阅读factor'?如果是这样的话,你现在所拥有的将不会产生你期望的ANOVA模型。 – John 2013-03-04 12:11:03

回答

2

重新创建矩阵:

df <- read.table(text="[,1] [,2] [,3] [,4] 
[1,] 1 1 1 0 
[2,] 1 2 1 0 
[3,] 3 2 1 0.6 
[4,] 1 1 1 0.2 
[5,] 1 2 1 0 
[6,] 1 1 2 0.1 
[7,] 3 2 1 0.9",header=TRUE) 
m <- as.matrix(df) 
colnames(m) <- NULL 

使用包data.table拆分申请-结合。由于数据集的高效性,建议使用data.table。

library(data.table) 
DT <- as.data.table(m) 

DT.agg <- DT[,sum(V4==0)/length(V4),by=list(V1,V2,V3)] 
setnames(DT.agg,c("factor1","factor2","factor3","data")) 
print(DT.agg) 
# factor1 factor2 factor3 data 
#1:  1  1  1 0.5 
#2:  1  2  1 1.0 
#3:  3  2  1 0.0 
#4:  1  1  2 0.0 

aov(data ~ factor1 * factor2 * factor3, data = DT.agg) 
0

这是plyr包的解决方案。如果m是你的矩阵:

m <- data.frame(m) 
colnames(m) <- c("V1","V2","V3","data") 
m2 <- ddply(m, .(V1,V2,V3), summarise, data=sum(data==0)/length(data)) 

其中给出:

V1 V2 V3 data 
1 1 1 1 0.5 
2 1 1 2 0.0 
3 1 2 1 1.0 
4 3 2 1 0.0 

你可以再做:

aov(data=m2, data ~ V1 * V2 * V3) 

plyr并不总是最快的解决方案,但。

+0

@罗兰感谢您的编辑。 – juba 2013-03-04 10:24:54

2

如果你的矩阵是非常大的,不要忘记,包括尝试,当转换为data.table的成本。以下应该相当快。

colnames(m) <- c(paste0('factor', 1:3), 'data') 
aggregate(data ~ ., data = m, function(x) mean(x!=0)) 

可是我测试,它原来,plyr实际上是data.table这里相当有竞争力和聚集相当落后(3次)。最近的版本plyr(1.8)比以前快得多。

在一些测试中,我发现如果首先转换为data.frame(即使包含data.frame转换时间),聚合速度会变得更快(2倍)。

没有发布的答案真的很慢。如果你有很多这些矩阵,我想他们在文件中,如果你的代码很慢,我猜你可能有一个瓶颈。有许多方法来优化矩阵从文件(使用scan而不是read.table

(顺便说一句,你可能不应该对这些数据做ANOVA)