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 …