2015-05-08 33 views
1

我是新来的R和希望各行的名字知道我怎么可以设置行的名称与尺寸较大的矩阵92235 X 17如何设置中的R

我想设置的行名使其从“1×2”,“1×3”,“1×4”...“1×430”,“2×3”,“2×4”...“2×430” ,“3×4”,“3×5”...“3×430”...“429×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

+1

很高兴有一个例子,我们可以<一起工作,像'垫子 - 矩阵(1:4)'在戴恩的回答。这里有一些关于询问的一般建议:http://stackoverflow.com/q/5963269/1191259 – Frank

+0

错误发生是因为当'i = 430'时它开始在'from = i + 1 = 431'处开始计数'j'大于'to = 430'。我认为你的意思是'我'只能走'1:429' – Frank

回答

3

你不需要在这里一环。您可以使用rownames函数按如下方式设置矩阵的行名称。

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] 

一般来说,你可以使用

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:ceiling(nrow(mat)/n), each = n), "x", 1:n)[1:nrow(mat)] 

其中n是您希望重复第一个号码的次数。

编辑基于COMMENT

要获得行名不包括“2×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

你的排名并不是OP想要的:在“1 x 430”之后,你得到“2 x1”,而它应该是“2 x 3” 。 – Stibu

+0

@Stibu感谢您的澄清。 – dayne

+0

没问题。我喜欢你的'expand.grid'解决方案。 – Stibu

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 

但有可能是一个更优雅的方式来实现这一目标?

+0

感谢您澄清错误信息!这是一种错误的错误,不是吗? – pophahpop

+0

从概念上讲,你疯狂的一个错误,因为你让你的第一个for循环运行到430,即使你实际上只需要它去到429.但是错误信息有另一个起源:R意识到你开始一个无限循环(从增量+1的431到430),从而停止。 – Stibu