R:适用于所有矩阵元素

时间:2013-06-18 22:10:35

标签: r apply

这似乎是如此基本以至于我几乎不好意思问这个问题,但我无法让这个工作起来。什么是相同的适用于此。这是一个人为的例子,因为我想通过行和列索引访问每个单元格的数据,但它代表了问题。

ndat<-matrix(c(1:100), ncol=10)
for (i in 1:nrow(ndat)) {
    for (j in 1:ncol(ndat)) {
        cat(ndat[i,j]," ")
    }  
    cat("\n")
}

这是实际问题。我试图在网格上绘制矩阵。我知道textplot可以绘制矩阵,但我需要对网格进行更多控制。文本的位置取决于行和列索引。代码如下:

plot.new()
tlx <- 0.04
tly <- 0.96
label_shift <- 0.04
text(tlx + label_shift, tly, "Columns", cex=1, adj=c(0,0))
text(tlx, tly - label_shift, "Rows", cex=1, adj=c(0,1), srt=-90)
ndat<-matrix(c(1:100), ncol=10)
dimnames(ndat) <- list(paste("R",1:10,sep=""), paste("C",1:10,sep=""))
row_name_space <- 0.1
col_name_space <- 0.1
data_width <- 0.075
data_height <- 0.075
x1 <- 1.5 * tlx 
x2 <- x1 + row_name_space + ncol(ndat) * data_width
y1 <- tly - 0.5*tlx
y2 <- y1 - col_name_space - nrow(ndat) * data_height
lines(c(x1,x1), c(y1,y2))
lines(c(x1,x2), c(y1,y1))
vertical_lseg <- function(n) {
        lx <- x1 + row_name_space + (n - 1) * data_width
        xv <- c(lx, lx)
        yv <- c(y1, y2)
        lines (xv, yv)
}
sapply(1:(ncol(ndat)+1), vertical_lseg)
horizontal_lseg <- function(n) {
        ly <- y1 - col_name_space - (n - 1) * data_height
        xv <- c(x1, x2)
        yv <- c(ly, ly)
        lines (xv, yv)
}
sapply(1:(nrow(ndat)+1), horizontal_lseg)
sapply(1:nrow(ndat), function(x) text(1.5 * tlx + row_name_space / 2, tly - 0.5*tlx - col_name_space - (x - 0.5) * data_height, rownames(ndat)[x], adj=c(0.5,0.5), cex=1))
sapply(1:ncol(ndat), function(x) text(1.5*tlx + col_name_space + (x - 0.5) * data_width, tly - 0.5*tlx - col_name_space /2, colnames(ndat)[x], adj=c(0.5,0.5), cex=1))
# This is where the text would be plotted. The calculation of x and y is right but the number of elements that outer produces seems to be 10,000
# rather than 100
outer(1:nrow(ndat), 1:ncol(ndat), FUN=function(r,c) text(1.5*tlx + col_name_space + (c - 0.5) * data_width, 
                                                         tly - 0.5*tlx - col_name_space - (r - 0.5) * data_height, 
                                                         toString(ndat[r,c]), adj=c(0.5,0.5), cex=1))

3 个答案:

答案 0 :(得分:4)

来自?apply

  

MARGIN:一个向量,给出了函数的下标             适用于。例如,对于矩阵“1”表示行,“2”             表示列,'c(1,2)'表示行和列。             'X'命名为dimnames,它可以是一个字符向量             选择尺寸名称。

所以你想要:

ndat<-matrix(c(1:100), ncol=10)
apply(ndat, 1:2, cat)

答案 1 :(得分:3)

很难说不知道你想做什么,但矩阵是具有维度的向量。因此,矢量化函数通常可以直接工作:

ndat<-matrix(c(1:100), ncol=10)
ndat^2

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1  121  441  961 1681 2601 3721 5041 6561  8281
 [2,]    4  144  484 1024 1764 2704 3844 5184 6724  8464
 [3,]    9  169  529 1089 1849 2809 3969 5329 6889  8649
 [4,]   16  196  576 1156 1936 2916 4096 5476 7056  8836
 [5,]   25  225  625 1225 2025 3025 4225 5625 7225  9025
 [6,]   36  256  676 1296 2116 3136 4356 5776 7396  9216
 [7,]   49  289  729 1369 2209 3249 4489 5929 7569  9409
 [8,]   64  324  784 1444 2304 3364 4624 6084 7744  9604
 [9,]   81  361  841 1521 2401 3481 4761 6241 7921  9801
[10,]  100  400  900 1600 2500 3600 4900 6400 8100 10000

我提到这一点的原因是,与apply相比,这样做可能会大幅提速。

答案 2 :(得分:2)

你正在做的事情可以这样模拟:

apply(ndat, 1, function (k) cat(k, "\n"))