Транспонирование большого кадра данных / матрицы в R - PullRequest
0 голосов
/ 18 января 2012

Я столкнулся со странной проблемой переноса большого набора данных. Я хочу получить список нелинейных маршрутов полета (то есть подсписки векторов с 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 ..

Благодарен за любую помощь!

Ответы [ 2 ]

2 голосов
/ 18 января 2012

3729792: 116556 * 32

Это правильно.length() для матрицы говорит о количестве элементов в матрице (которые вы проверили).length() для data.frame говорит о количестве столбцов, которые у него есть.

Если вы хотите сравнить яблоки с яблоками при сравнении data.frame с matrix, используйте nrow() и ncol()

0 голосов
/ 18 января 2012

Я немного догадываюсь о вашей структуре данных, но вы намекнули, что это список числовых векторов.

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, поскольку он дает тот же ответ, но с более читаемым кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...