我是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
答案 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
您可以使用rep
和paste
的组合创建自定义行名称:
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
但实现这一目标可能有更优雅的方式......