如何在R中设置单个行名称

时间:2015-05-08 15:13:51

标签: r matrix

我是R的新手,想知道如何将行名设置为尺寸为92,235 x 17的大矩阵。

我想设置行名称,使其从“1 x 2”,“1 x 3”,“1 x 4”......“1 x 430”,“2 x 3”,“2 x 4“......”2 x 430“,”3 x 4“,”3 x 5“......”3 x 430“......”429 x 430“。

我知道我需要两个for循环

for(i in 1:430) {
    for(j in seq(from = i+1, to = 430, by = 1))
        # set row names
}

但是一旦我这样做,我就会收到错误

Error in seq.default(from = i + 1, to = 430, by = 1) : wrong sign in 'by' argument

如何更正此错误以及如何自定义行名称?

TIA

2 个答案:

答案 0 :(得分:3)

这里不需要循环。您可以使用rownames函数为矩阵设置行名称,如下所示。

mat <- matrix(1:4)
rownames(mat)
# NULL

rownames(mat) <- c("row1", "row2", "row3", "row4")

mat
#      [,1]
# [1,]    1
# [2,]    2
# [3,]    3
# [4,]    4

rownames(mat) <- c("row1", "row2", "row3", "row4")
mat
#      [,1]
# row1    1
# row2    2
# row3    3
# row4    4

您可以使用reppaste的组合创建自定义行名称:

paste(rep(1:2, each = 5), "x", 1:5)
# [1] "1 x 1" "1 x 2" "1 x 3" "1 x 4" "1 x 5" 
# [2] "2 x 1" "2 x 2" "2 x 3" "2 x 4" "2 x 5"

...或者您的具体示例:

paste(rep(1:215, each = 430), "x", 1:430)[1:92235]

一般情况下,您可以使用以下公式:

paste(rep(1:ceiling(nrow(mat)/n), each = n), "x", 1:n)[1:nrow(mat)]

其中n是您想要重复第一个数字的次数。

基于评论的编辑

要获取不包含“2 x 1”的行名称,一种方法是使用expand.grid

library(data.table)
tmp <- as.data.table(expand.grid(1:2, 1:5))
tmp <- tmp[Var2 > Var1][order(Var1)]
paste(tmp$Var1, "x", tmp$Var2)
# [1] "1 x 2" "1 x 3" "1 x 4" "1 x 5" 
# [2] "2 x 3" "2 x 4" "2 x 5"

答案 1 :(得分:1)

错误消息的原因仅仅是i=430,第二个循环尝试从增量+1开始从431运行到430。 R意识到增量应该是负的,因此会引发错误。

现在针对您的具体问题:正如Dayne已经指出的那样,您可以使用rownames来设置矩阵的行名称。您应该使用apply函数而不是for循环生成名称。这是一种可能性。

M <- matrix(rep(0,92235*17),ncol=17)
rn <- unlist(sapply(1:429,function(i) paste(i,"x",(i+1):430)))
rownames(M) <- rn

但实现这一目标可能有更优雅的方式......