Error setting rowname if rowname currently NULL
snubian wrote:
<snip>
I've noticed a behaviour when using rownames() that I think is odd,
wondering if I'm doing something wrong.
To illustrate, say I create a very simple matrix (called fred):
fred<-matrix(,4,2)
It looks like this:
[,1] [,2]
[1,] NA NA
[2,] NA NA
[3,] NA NA
[4,] NA NA
... and
rownames(fred)
# NULL
If I now try and set a row name for one of the rows (say the first row) to "APPLE", by doing this: rownames(fred)[1] <- "APPLE"
... so now rownames(fred) would have to become a vector of length one, and you're trying to use a vector of length one to name rows in a matrix with four rows. (in principle, you could argue that the vector should be recycled on such an occassion, as it happens in many other situations.) hence
I get an error: Error in dimnames(x) <- dn : length of 'dimnames' [1] not equal to array extent
... because 1 != 4
However, I found that if I first set all the rownames to anything at all, by using say: rownames(fred) <- c(1:4)
... so that length(rownames(fred)) == 4
Which gives me: [,1] [,2] 1 NA NA 2 NA NA 3 NA NA 4 NA NA Then my desired command works, and thus: rownames(fred)[1] <- "APPLE"
... whereby you change one element in rownames(fred) and it still has 4 elements
Gives me what I want:
[,1] [,2]
APPLE NA NA
2 NA NA
3 NA NA
4 NA NA
So, what this says to me is that to set the row names INDIVIDUALLY, they
first need to be set to something (anything!).
not exactly true:
fred = matrix(, 4, 2)
rownames(fred)[4] = 'foo'
here you'd set the 4th element of rownames(fred), which fill the first
three with NA, and rownames(fred) has length 4, as needed.
For what I am doing, I need to set the row names one at a time, as I iterate through a loop.
is it possible that you don't really need it? vQ