【问题标题】:R: rownames, colnames, dimnames and names in applyR:应用中的行名、列名、暗名和名称
【发布时间】:2013-02-20 04:08:43
【问题描述】:

我想使用 apply 来遍历矩阵的行,并且我想在我的函数中使用当前行的行名。看来您不能直接在函数内部使用rownamescolnamesdimnamesnames。我知道我可以根据this question 中的信息创建一个解决方法。

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

我只是想了解 apply 内部发生了什么?非常感谢。

【问题讨论】:

    标签: r function base apply


    【解决方案1】:

    我认为您的困惑源于apply 没有将数组(或矩阵)传递给FUN 中指定的函数。

    它依次传递矩阵的每一行。每行本身“只是”一个(命名的)向量:

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

    所以你的函数只有这个命名向量可以使用。

    对于您的中间示例,如 apply 中所述:

    如果每次调用 FUN 返回一个长度为 n 的向量,则 apply 返回 如果 n > 1,则为维度为 c(n, dim(X)[MARGIN]) 的数组。如果 n 等于 1, 如果 MARGIN 的长度为 1 且数组为 尺寸 dim(X)[MARGIN] 否则。

    所以function(x) names(x) 为每一行返回一个长度为 3 的向量,所以最终结果就是你看到的矩阵。但是该矩阵是在 apply 函数的末尾构造的,FUN 的结果分别应用于每一行。

    【讨论】:

      猜你喜欢
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      相关资源
      最近更新 更多