R:rownames,colnames,dimnames和地名申请(R: rownames, col

2019-08-17 07:32发布

我想用适用于跨矩阵的行运行,我想用当前行的rowname在我的功能。 看来你不能使用rownamescolnamesdimnamesnames直接在函数内部。 我知道我可以基于信息可能创建一个解决方法这个问题 。

但我的问题是如何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

我只是想了解内部情况的申请? 非常感谢。

Answer 1:

我觉得你的困惑来自这样一个事实茎apply未通过的阵列(或矩阵)中规定的功能FUN

它通过依次矩阵的每一行。 每一行本身是“唯一”一个(命名)向量:

> m[1,]
         a          b          c 
0.48768161 0.61447934 0.08718875 

所以,你的函数只有这个名为向量的工作。

对于你的中间例如,记录在apply

如果每次调用FUN返回长度n的向量,然后应用返回尺寸c(N,暗淡(X)[MARGIN])的阵列如果n> 1,如果n等于1,应用返回的载体如果具有MARGIN长度1和尺寸的阵列暗淡(X)[MARGIN]否则。

所以function(x) names(x)返回每行长度为3的向量,所以最后的结果是你看到的矩阵。 但基质在的末端被构造apply功能上的结果FUN被施加到每一行单独地。



文章来源: R: rownames, colnames, dimnames and names in apply