【问题标题】:Transposing a large dataframe / matrix in R在 R 中转置大型数据帧/矩阵
【发布时间】:2012-01-18 13:21:24
【问题描述】:

在转置大型数据集时遇到了一个奇怪的问题。我想将非线性飞行路线列表(即每个具有 30 个顶点的向量子列表)放入数据框(顶点有 32 列)。列表强制转换为 data.frame 没有问题,但在 (1) 用 t(x) 转置和 (2) 转换为矩阵时失败。

To illustrate:

> class(gc)
[1] "list"

> length(gc)
[1] 58278

> gc[[1]][1:30]
 [1] 147.2200 147.1606 147.1012 147.0418 146.9824 146.9231 146.8638
 [8] 146.8046 146.7454 146.6862 146.6270 146.5679 146.5088 146.4498
[15] 146.3908 146.3318 146.2728 146.2139 146.1550 146.0961 146.0373
[22] 145.9785 145.9197 145.8610 145.8022 145.7435 145.6849 145.6262
[29] 145.5676 145.5090

> gc2 <- data.frame(gc)

> nrow(gc2)
[1] 32

> length(gc2)
[1] 116556

> gc2[1:5,1:5]
       lon       lat     lon.1    lat.1     lon.2
1 147.2200 -9.443383 -80.37861 43.46083 -87.90484
2 147.1606 -9.335072 -80.23135 43.52385 -87.53193
3 147.1012 -9.226751 -80.08379 43.58667 -87.15751
4 147.0418 -9.118420 -79.93591 43.64931 -86.78161
5 146.9824 -9.010080 -79.78773 43.71175 -86.40421

> gc3 <- t(gc2)

> nrow(gc3)
[1] 116556

> length(gc3)
[1] 3729792

> gc3 <- as.matrix(gc2)

> nrow(gc3)
[1] 32

> length(gc3)
[1] 3729792

3729792这个数字是116556*32..

感谢您的帮助!

【问题讨论】:

  • “失败”是什么意思?转置的结果是矩阵,而不是 data.frame:它的长度是元素的数量,即 rows*columns -- data.frame 的长度是列数。
  • 我们可以玩弄一个工作示例怎么样?
  • 欢迎来到 SO。为了将来参考,如果问题包含问题,而不是关于“这不起作用”的陈述,通常会更清楚。

标签: r dataframe


【解决方案1】:

3729792图为116556*32

没错。矩阵的length() 告诉您矩阵包含的元素数量(您已验证)。 length() data.frame 告诉你它有多少列。

如果您想在data.framematrix 比较中将苹果与苹果进行比较,请使用nrow()ncol()

【讨论】:

  • 谢谢 v.m.对于回复。对于重复的问题和缺乏清晰度,我深表歉意——我是 stackoverflow 的新手,对 R 来说还是个新手,因此非常感谢您的耐心等待。问题是我将 t() 输出解释为具有 3729792 列,因为我不理解输出是一个矩阵。感谢大家指出这一点!
【解决方案2】:

我对你的数据结构有点猜测,但你暗示它是一个数字向量列表。

n_routes <- 5
gc <- replicate(n_routes, runif(30), simplify = FALSE)
names(gc) <- letters[seq_len(n_routes)]

您可以使用as.data.frame(gc) 将此列表转换为向量,但请注意,数据框并不意味着要转置(如果列具有不同的类型,则没有意义。

这意味着在转置之前需要先转换成数据框再转换成矩阵。

gc2 <- t(as.matrix(as.data.frame(gc)))

由于您的所有列都是数字,您可能希望将其保留为矩阵。或者,再次使用as.data.frame 使其成为数据框。

as.data.frame(gc2)

正如其他人指出的那样,length 对于矩阵和数据帧有不同的含义。数据帧的定义——列的数量——是不直观的,并且是 S 兼容性的遗留问题。请改用ncol,因为它给出了相同的答案,但代码更易读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    • 2019-08-26
    • 1970-01-01
    • 2011-09-11
    • 2014-09-08
    相关资源
    最近更新 更多