2012-01-18 98 views
0

上午遇到了转移大型数据集的奇怪问题。我想获得非线性飞行路线列表(即,每个具有30个顶点的向量的子列表)到数据帧(顶点有32列)。该列表强制到data.frame没有问题,但当(1)与t(x)和(2)转换为矩阵转换时失败。将大型数据框/矩阵转换为R

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 ..

感谢的任何援助!

+0

“失败”是什么意思?转置的结果是一个矩阵,而不是data.frame:其长度是元素的数量,即行*列 - data.frame的长度是列的数量。 – 2012-01-18 13:30:52

+0

我们可以玩弄一个可行的例子吗? – 2012-01-18 14:05:19

+0

欢迎来到SO。为了将来的参考,如果问题包含一个问题,而不是关于“这不起作用”的陈述,问题往往更加清晰。 – 2012-01-18 16:09:47

回答

2

3729792数字是116556×32

这是正确的。 length()为矩阵告诉你矩阵所包含的元素的数量(你已经验证过)。 length()代表data.frame告诉你它有多少列。

如果要比较苹果和苹果在data.framematrix比较,使用nrow()ncol()

+0

感谢v.m.为答复。并且我对重复问题和缺乏清晰度表示歉意 - 我是全新的stackoverflow,并且仍然是R的新手,因此您的耐心非常感谢。 问题是我解释t()输出为3729792列,因为我不明白输出是矩阵。感谢大家指出这一点! – geotheory 2012-01-23 18:18:47

0

我猜一点点在你的数据结构,但你已经暗示,它的数值列表向量。

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,因为它给出了相同的答案,但代码更具可读性。