'dimnames'[1]的长度不等于数组范围'是什么意思?

时间:2012-10-20 05:46:53

标签: r

我有一个data.frame,我可以用matplot绘图:

> dim(lhbyzone)
[1] 38070    21
> matplot(lhbyzone)
(no error occurs here)

但如果我抓住lh的头,并尝试,它会给我一个奇怪的错误:

> foo <- head(lhbyzone,1000)
> matplot(foo)
Error in `rownames<-`(`*tmp*`, value = c("1", "2", "3", "4", "5", "6",  : 
  length of 'dimnames' [1] not equal to array extent

那么,也许与名字有关?

> dimnames(foo)
[[1]]
   [1] "1"    "2"    "3"    "4"    "5"    "6"    "7"    "8"    "9"    "10"  
  [11] "11"   "12"   "13"   "14"   "15"   "16"   "17"   "18"   "19"   "20"  
  [21] "21"   "22"   "23"   "24"   "25"   "26"   "27"   "28"   "29"   "30"  
  [31] "31"   "32"   "33"   "34"   "35"   "36"   "37"   "38"   "39"   "40"  
...
 [951] "951"  "952"  "953"  "954"  "955"  "956"  "957"  "958"  "959"  "960" 
 [961] "961"  "962"  "963"  "964"  "965"  "966"  "967"  "968"  "969"  "970" 
 [971] "971"  "972"  "973"  "974"  "975"  "976"  "977"  "978"  "979"  "980" 
 [981] "981"  "982"  "983"  "984"  "985"  "986"  "987"  "988"  "989"  "990" 
 [991] "991"  "992"  "993"  "994"  "995"  "996"  "997"  "998"  "999"  "1000"

[[2]]
 [1] "time" "z1"   "z2"   "z3"   "z4"   "z5"   "z6"   "z7"   "z8"   "z9"  
[11] "z10"  "z11"  "z12"  "z13"  "z14"  "z15"  "z16"  "z17"  "z18"  "z19" 
[21] "z20" 

> dim(foo)
[1] 1000   21

> names(foo)
 [1] "time" "1"    "2"    "3"    "4"    "5"    "6"    "7"    "8"    "9"   
[11] "10"   "11"   "12"   "13"   "14"   "15"   "16"   "17"   "18"   "19"  
[21] "20" 

尺寸看起来一样吗?这很奇怪,因为原始帧上的matplot可以工作,但不能在帧的头部。这可能会发生什么?

编辑,好吧,所以回答一些问题,让我们使用thbyzone而不是lhbyzone,因为它更小,让我们使用head而不是head(..,1000)来缩小数据

> head(thbyzone)
  time  1  2  3  4  5  6  7  8  9 10 11
1    1 46 38 44 45 42 44 45 43 41 42 36
2    2 46 36 42 43 42 43 44 44 39 43 32
3    3 45 35 40 41 40 42 41 42 36 43 31
4    4 41 30 36 37 39 38 40 34 35 39 30
5    5 39 30 34 33 40 38 35 30 33 35 34
6    6 35 29 32 32 41 37 35 35 36 35 35

> dimnames(head(thbyzone))
[[1]]
[1] "1" "2" "3" "4" "5" "6"

[[2]]
 [1] "time" "1"    "2"    "3"    "4"    "5"    "6"    "7"    "8"    "9"   
[11] "10"   "11" 

> matplot(head(thbyzone))
Error in `rownames<-`(`*tmp*`, value = c("1", "2", "3", "4", "5", "6",  : 
  length of 'dimnames' [1] not equal to array extent

> matplot(as.matrix(head(thbyzone)))
Error in `rownames<-`(`*tmp*`, value = c("1", "2", "3", "4", "5", "6",  : 
  length of 'dimnames' [1] not equal to array extent

> matplot(thbyzone[1:6,])
Error in `rownames<-`(`*tmp*`, value = c("1", "2", "3", "4", "5", "6",  : 
  length of 'dimnames' [1] not equal to array extent

> class(thbyzone)
[1] "cast_df"    "data.frame"

> str(thbyzone)
List of 12
 $ time: num [1:39432] 1 2 3 4 5 6 7 8 9 10 ...
 $ 1   : int [1:39432] 46 46 45 41 39 35 33 33 36 47 ...
 $ 2   : int [1:39432] 38 36 35 30 30 29 28 28 28 33 ...
 $ 3   : int [1:39432] 44 42 40 36 34 32 30 30 30 32 ...
 $ 4   : int [1:39432] 45 43 41 37 33 32 30 29 30 41 ...
 $ 5   : int [1:39432] 42 42 40 39 40 41 38 33 36 43 ...
 $ 6   : int [1:39432] 44 43 42 38 38 37 36 36 38 44 ...
 $ 7   : int [1:39432] 45 44 41 40 35 35 33 30 31 39 ...
 $ 8   : int [1:39432] 43 44 42 34 30 35 34 33 34 41 ...
 $ 9   : int [1:39432] 41 39 36 35 33 36 32 31 31 35 ...
 $ 10  : int [1:39432] 42 43 43 39 35 35 33 33 35 42 ...
 $ 11  : int [1:39432] 36 32 31 30 34 35 32 30 28 30 ...
 - attr(*, "row.names")= int [1:39432] 1 2 3 4 5 6 7 8 9 10 ...
 - attr(*, "idvars")= chr "time"
 - attr(*, "rdimnames")=List of 2
  ..$ :'data.frame':    39432 obs. of  1 variable:
  .. ..$ time: num [1:39432] 1 2 3 4 5 6 7 8 9 10 ...
  ..$ :'data.frame':    11 obs. of  1 variable:
  .. ..$ station_id: int [1:11] 1 2 3 4 5 6 7 8 9 10 ...

> traceback()
.... lots of lines ...
   "39405", "39406", "39407", "39408", "39409", "39410", "39411", 
   "39412", "39413", "39414", "39415", "39416", "39417", "39418", 
   "39419", "39420", "39421", "39422", "39423", "39424", "39425", 
   "39426", "39427", "39428", "39429", "39430", "39431", "39432"
   ))
4: as.matrix.cast_df(y)
3: as.matrix(y)
2: ncol(y <- as.matrix(y))
1: matplot(thbyzone[1:6, ])

更多尝试:

> foo <- head(thbyzone)
> foo$time <- NULL
> matplot(foo)
Error in `rownames<-`(`*tmp*`, value = c("1", "2", "3", "4", "5", "6",  : 
  length of 'dimnames' [1] not equal to array extent
> head(foo)
   1  2  3  4  5  6  7  8  9 10 11
1 46 38 44 45 42 44 45 43 41 42 36
2 46 36 42 43 42 43 44 44 39 43 32
3 45 35 40 41 40 42 41 42 36 43 31
4 41 30 36 37 39 38 40 34 35 39 30
5 39 30 34 33 40 38 35 30 33 35 34
6 35 29 32 32 41 37 35 35 36 35 35

编辑:

> options(error=recover)
> matplot(thbyzone[1:6,])
Error in `rownames<-`(`*tmp*`, value = c("1", "2", "3", "4", "5", "6",  : 
  length of 'dimnames' [1] not equal to array extent

Enter a frame number, or 0 to exit   

1: matplot(thbyzone[1:6, ])
2: ncol(y <- as.matrix(y))
3: as.matrix(y)
4: as.matrix.cast_df(y)
5: `rownames<-`(`*tmp*`, value = c("1", "2", "3", "4", "5", "6", "7", "8", "9"

6 个答案:

答案 0 :(得分:7)

好的,我可以使用reshape从头开始重现这一点(但不能使用reshape2)。事情确实被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

具体问题是utils::head.data.frame之间的交互,它在不保持完全一致的内部结构的情况下丢弃对象的部分,而as.matrix.cast_df(由matplot调用),假定该结构在那里。

添加以下方法似乎可以解决问题。

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
}

可能值得联系维护者,尽管reshape包被(我认为)弃用,而不是reshape2 ...

另一种解决方法是尽可能从reshape::cast切换到reshape2::dcast ......

答案 1 :(得分:1)

我有同样的错误。虽然此答案不适用于此问题的具体示例,但它可以帮助前往此页面的未来用户获取有关错误的帮助。

我的列名包含数字和符号,例如17:901。这就是抛出错误。使用make.names功能将我的列名称转换为语法上有效的名称&#39;例如。 names(df)<-make.names(names(df))

这解决了这个问题。

答案 2 :(得分:1)

我有同样的错误,但在我的情况下,一列(最后一列)在聚集后仅具有NA值。删除此列可恢复理智。您可以检查确认您没有类似的问题。

答案 3 :(得分:1)

对于那些在使用mvoutlier::plot.mvoutlierCoDa(...)时收到此错误的用户,将参数onlyout(仅绘图异常值)设置为TRUE(默认值)并且您的数据集没有包含任何异常值。设置onlyout=FALSE应该可以。运行mvoutlier.CoDa(df)$outliers,查看您的数据集是否包含离群值。

答案 4 :(得分:0)

仅供参考

xts对象的名称是股票代号,我遇到了类似的问题。
物体y和z

名称(z)

[1]“ 000100 KS”“ 000333 C2”“ 000423 CH”“ 000651 CH”“ 000660 KS”“ 002008 C2”“ 002415 C2”“ 002456 C2” [9]“ 002475 CH”

“ 002747 CH”

all.equal(names(y),names(z))是

all.equal(index(y),index(z))是

昏暗(y)489 10

dim(z)489 10

dim(y [“ 2019-08”,])

[1] 31 10

dim(z [“ 2019-08”,])

[.xts(z,“ 2019-08”,)中的错误:

'dimnames'[1]的长度不等于数组范围

但是

名称(z)<-make.names(名称(z))

dim(z [“ 2019-08”,])

[1] 31 10

不知道为什么xts []选择对对象y有效但对z无效。

现在,我只需要编写一个快速帮助器函数,即可从新的“在语法上有效”(但在语义上不再有效...)名称取回股票行情。

答案 5 :(得分:0)

我在使用 data.frame 时遇到了类似的问题,我尝试将其转换为 data.table 并给了我同样的问题。我解决了:

data <- data %>% as.matrix(.) %>% as.data.table(.)