【问题标题】:Changing dimnames of matrices and data frames in R在 R 中更改矩阵和数据帧的名称
【发布时间】:2011-01-18 18:45:08
【问题描述】:

假设我创建了以下矩阵:

> x <- matrix(1:20000,nrow=100)
> x[1:10,1:10]
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1  101  201  301  401  501  601  701  801   901
 [2,]    2  102  202  302  402  502  602  702  802   902
 [3,]    3  103  203  303  403  503  603  703  803   903
 [4,]    4  104  204  304  404  504  604  704  804   904
 [5,]    5  105  205  305  405  505  605  705  805   905
 [6,]    6  106  206  306  406  506  606  706  806   906
 [7,]    7  107  207  307  407  507  607  707  807   907
 [8,]    8  108  208  308  408  508  608  708  808   908
 [9,]    9  109  209  309  409  509  609  709  809   909
[10,]   10  110  210  310  410  510  610  710  810   910

R中更改行名和列名的方法有哪些?例如,我喜欢行名是SS1, SS2, ..., SS100,列名是M1, M2, ..., M200。我通常使用具有 1000 行和列的数据,我需要一个好的方法来做到这一点。有些人使用attributes(x)$dimnames &lt;- list(...) 之类的东西,有些人使用rownames &lt;- paste(...)。所有可能的方法是什么?

我的第二个问题是,我可以在将矩阵转换为数据框后使用相同的方法吗?

【问题讨论】:

    标签: r dimensions columnname rowname


    【解决方案1】:

    如果它在列表中,您可以这样做。

     dimnames(x)[[1]]<-paste("SS", 1:nrow(x), sep="")
     dimnames(x)[[2]]<-paste("M" , 1:ncol(x), sep="")
    

    【讨论】:

    • 抱歉,矩阵不太好,你能举个例子说明什么时候 dimnames(matrix) 是一个列表吗?
    • 不是dimnames 是一个列表,而是矩阵在一个列表中。如果矩阵在列表中,则不能使用 row.names 和 colnames 属性。 dimnames 也可以用于阶数大于 2 的数组。
    • matrix_in_a_list = list(matrix(1:4,2,2,dimnames=list(c("a","b"),1:2))) ; dimnames(matrix_in_a_list) 给我 NULL.. 发生了什么?
    • matrix_in_a_list = list(matrix(1:4,2,2)) ; dimnames(matrix_in_a_list[[1]])
    • 您必须将 dimnames 分配给列表中的矩阵而不是列表本身。 dimname 也是一个需要直接引用的属性。
    【解决方案2】:

    从评论到回答:

    row.names(x) <- paste("SS", 1:nrow(x), sep="")
    colnames(x) <-  paste("M" , 1:ncol(x), sep="")
    

    正如@doug 所写,它适用于矩阵和数据框。

    【讨论】:

      【解决方案3】:

      是的,同样的方法也可以使用(matrix/data.frame)——见下文:

      A = matrix(1:12, nrow=4)
      colnames(A) = c("col1", "col2", "col3")
      row.names(A) = c("row1", "row2", "row3", "row4")
      
      dfA = as.data.frame(A)
      row.names(dfA) = c("r1", "r2", "r3", "r4")
      colnames(A) = c("C1", "C2", "C3")
      

      为了节省时间,您可以这样做:

      x = rep("col", dim(M)[2])
      y = 1:dim(M)[2]
      colnames(M) = paste(x, y, sep="")
      

      【讨论】:

      • 好的,但我有 1000 行和列。我就是不能输入 r1, r2, ... r1253, ... 等等。应该有一些自动计数器和粘贴操作。
      • row.names(A) &lt;- paste("SS",1:nrow(A),sep="");colnames(A)&lt;-paste("M",1:ncol(A),sep="")
      • @Marek:您能否将其添加为答案?
      • 编辑了我的答案以包含一个 sn-p 来自动创建行和列名称
      • 同时:) 顺便说一句,你不需要rep 前缀(“col”),paste 为你做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2022-07-14
      • 2020-07-14
      • 1970-01-01
      • 2017-03-29
      相关资源
      最近更新 更多