What does 'length of 'dimnames' [1] not equal to array extent' mean?

OK, I can reproduce this from scratch, with reshape (but not with reshape2). Something is indeed getting mangled by head().

d <- data.frame(time=rep(1:10,10),x=rep(1:10,each=10),y=1:100)
library(reshape2)
str(dcast(d,time~x))  ## regular data frame
detach("package:reshape2")
library(reshape)
str(z <- cast(d,time~x))
matplot(head(z))  ## error

The specific problem is an interaction between utils::head.data.frame, which drops pieces of the object without keeping a completely consistent internal structure, and as.matrix.cast_df (called by matplot), which assumes that structure is there.

Adding the following method seems to fix the problem.

head.cast_df <- function (x, n = 6L, ...)  {
    stopifnot(length(n) == 1L)
    n <- if (n < 0L) {
        max(nrow(x) + n, 0L)
    } else min(n, nrow(x))
    h <- x[seq_len(n), , drop = FALSE]
    ## fix cast_df-specific row names element
    attr(h,"rdimnames")[[1]] <- rdimnames(h)[[1]][seq_len(n),,drop=FALSE]
    h
}

It might be worth contacting the maintainer about this, although the reshape package is (I think) deprecated in favor of reshape2 ...

An alternative workaround is to switch from reshape::cast to reshape2::dcast if possible ...


I had the same error. Although this answer does not apply to the specific example of this question, it may help future users who travel to this page for help with the error.

The names of my columns contained numbers and symbols such as 17:901. This was throwing the error. Using the make.names function turned my column names into 'syntactically valid names' eg. names(df)<-make.names(names(df))

This solved the problem.

Tags:

R