我今天遇到了一个问题。

name A A B C C C

SF1 680.11 904.46 843.50 1288.24 1162.20 843.82

SRSF11 1075.75 872.80 758.74 936.98 763.94 818.37

SRSF11 1075.75 872.80 758.74 936.98 763.94 818.37

SRSF12 715.56 696.64 695.58 687.81 759.67 715.00

SRSF12 28.50 16.13 18.50 17.38 22.50 21.00

FOX1 134.48 134.86 150.68 114.23 111.77 157.93

FOX1 138.58 135.08 150.40 115.02 114.02 155.38

PRPF3 503.24 213.47 169.97 179.71 255.57 216.32

FOX2 91.55 193.67 214.80 271.79 317.23 249.17

FOX2 92.17 239.50 261.42 317.08 382.00 180.50

请问如何 得出 一个列名为 A, B, C,行名为 SF1, SRSF11, SRSF12, FOX1, PRPF3, FOX2 的矩阵?(A列SF1的值表示 数据中所有值的平均值。)

其实就是矩阵分块运算,如何告诉一个行factor和一个列factor,然后用tapply()。

我想写一个类似tapply的函数实现功能: mtapply(M, col.index, row.index, function),但是水平有限。请大家帮忙。

5 天 后

fun=function(file,fac){

a=read.csv(file,stringsAsFactors=F,row.names=NULL)

b=aggregate(.~name,data=a,FUN=sum)

len=length(b[,1])

len2=length(levels(fac))

result=matrix(data=NA,nrow=len,ncol=len2)

rownames(result)=b[,1]

colnames(result)=c("A","B","C")

for(i in 1:len)

{

result[i,1:len2]=tapply(as.numeric(b[i,2:(len+1)]),fac,sum)

}

result

}

file="第1章.csv"

fac=as.factor(c(1,1,2,3,3,3))

fun(file,fac)

[attachment=228607,1670]

回复 第1楼 的 wnfd:也可以这样:

<br />
x1 <- read.table("clipboard",sep='',header=T,check.names=F)<br />
l <- length(x1[1,])<br />
x2 <- apply(x[2:l],1,function(y) {tapply(y,as.factor(colnames(x1)[2:l]),mean)})<br />
colnames(x2) <- x1[,1]<br />
x3 <- apply(x2,1,function(y) {tapply(y,as.factor(colnames(x2)),mean)})<br />
[s:11]
</p>

回复 第2楼 的 frank230:可以不针对这个题目,写出一个函数吗?

多谢各位。我会整理一下,写出mapply的。

mapply(Matrix, colfactor, rowfactor, function(submatrix))。