gpt4 book ai didi

r - “'假名的长度'[1]不等于数组范围”是什么意思?

转载 作者:行者123 更新时间:2023-12-03 18:56:25 25 4
gpt4 key购买 nike

我有一个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"

最佳答案

好的,我可以使用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.frameas.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 ...

关于r - “'假名的长度'[1]不等于数组范围”是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12985653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com