Sim*_*lon 7 r function base apply
我想使用apply来遍历矩阵的行,我想在我的函数中使用当前行的rowname.看来你不能使用rownames,colnames,dimnames或names直接在函数内部.我知道我可能会根据此问题中的信息创建一个解决方法.
但我的问题是如何apply在它的第一个参数中处理数组的行名和列名,以及在函数内部创建的对象的名称赋值apply?它看起来有点不一致,我希望通过以下示例来展示.有没有理由为它设计这样的?
# Toy data
m <- matrix( runif(9) , nrow = 3 )
rownames(m) <- LETTERS[1:3]
colnames(m) <- letters[1:3]
m
a b c
A 0.5092062 0.3786139 0.120436569
B 0.7563015 0.7127949 0.003358308
C 0.8794197 0.3059068 0.985197273
# These return NULL
apply( m , 1 , FUN = function(x){ rownames(x) } )
NULL
apply( m , 1 , FUN = function(x){ colnames(x) } )
NULL
apply( m , 1 , FUN = function(x){ dimnames(x) } )
NULL
# But...
apply( m , 1 , FUN = function(x){ names(x) } )
A B C
[1,] "a" "a" "a"
[2,] "b" "b" "b"
[3,] "c" "c" "c"
# This looks like a column-wise matrix of colnames, with the rownames of m as the column names to me
# And further you can get...
n <- apply( m , 1 , FUN = function(x){ names(x) } )
dimnames(n)
[[1]]
NULL
[[2]]
[1] "A" "B" "C"
# But you can't do...
apply( m , 1 , FUN = function(x){ n <- names(x); dimnames(n) } )
NULL
Run Code Online (Sandbox Code Playgroud)
我只想了解申请内部会发生什么?非常感谢.
jor*_*ran 10
我认为你的困惑源于这样一个事实,即apply没有将数组(或矩阵)传递给指定的函数FUN.
它依次通过矩阵的每一行.每行本身"仅"一个(命名)向量:
> m[1,]
a b c
0.48768161 0.61447934 0.08718875
Run Code Online (Sandbox Code Playgroud)
因此,您的函数只能使用此命名向量.
对于您的中间示例,如下所述apply:
如果每次调用FUN都返回一个长度为n的向量,则如果n> 1,则apply返回维数c(n,dim(X)[MARGIN])的数组.如果n等于1,如果MARGIN的长度为1,则apply返回一个向量和另一个维度为dim(X)[MARGIN]的数组.
因此function(x) names(x),每行返回一个长度为3的向量,因此最终结果是您看到的矩阵.但是,在apply函数结束时构造该矩阵,在FUN单独应用于每一行的结果上.
| 归档时间: |
|
| 查看次数: |
6291 次 |
| 最近记录: |