2014-12-05 3 views
2

Мне нужно импортировать файл данных .mat (Matlab) в R и упорядочить его содержимое в виде фрейма данных. Хотя импорт является простым с использованием пакета R.matlab, преобразование в кадр данных показывает, что это сложно, поскольку данные изначально организованы каким-то неудобным способом. Похоже, есть два вложенных списка. Пока я не смог преобразовать его в фрейм данных.R - Помогите преобразовать вложенные списки (?) В data.frame

Вот то, что я до сих пор:

# Download original flux file 
oldwd <- getwd() 
tmp <- tempdir() 
setwd(tmp) 
url <- 'https://dl.dropboxusercontent.com/u/27700634/FLUX_DATA.mat' 
f <- file.path(tmp, 'FLUX_DATA.mat') 
download.file(url, f, method='curl') 
setwd(oldwd) 

# Read data using package R.matlab 
library(R.matlab) 
mlab <- readMat(f) 

И это структура файла:

> str(mlab) 
List of 1 
$ DATA:List of 16 
..$ : num [1:241, 1] 220 220 220 220 220 ... 
..$ : num [1:241, 1] -22 -35.2 -31.4 -20.5 -27 ... 
..$ : num [1:241, 1] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 
..$ : num [1:241, 1] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 
..$ : num [1:241, 1] -29.3 -25.5 -33.6 -36.8 -27.3 ... 
..$ : num [1:241, 1] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 
..$ : num [1:241, 1] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 
..$ : num [1:241, 1] 16.5 16.5 16 15.5 15.8 ... 
..$ : num [1:241, 1] 19.7 19.6 19.5 19.3 19.2 ... 
..$ : num [1:241, 1] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 
..$ : num [1:241, 1] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 
..$ : num [1:241, 1] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 
..$ : num [1:241, 1] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 
..$ : num [1:241, 1] 93.6 93.1 93.6 97.2 97.4 ... 
..$ : num [1:241, 1] -0.207 -0.831 -0.687 -0.214 -0.152 ... 
..$ :List of 15 
.. ..$ : chr [1, 1] "decimal day of year" 
.. ..$ : chr [1, 1] "net radiation (W/m2)" 
.. ..$ : chr [1, 1] "sensible heat flux (W/m2)" 
.. ..$ : chr [1, 1] "latent heat flux (W/m2)" 
.. ..$ : chr [1, 1] "ground heat flux (W/m2)" 
.. ..$ : chr [1, 1] "net ecosystem CO2 exchange (micromol/m2/s)" 
.. ..$ : chr [1, 1] "friction velocity (m/s)" 
.. ..$ : chr [1, 1] "air temperature (oC)" 
.. ..$ : chr [1, 1] "soil temperature at 2 cm (oC)" 
.. ..$ : chr [1, 1] "air pressure (kPa)" 
.. ..$ : chr [1, 1] "saturation vapor pressure at z = 3m (kPa)" 
.. ..$ : chr [1, 1] "actual vapor pressure at z = 3 m (kPa)" 
.. ..$ : chr [1, 1] "specific humidity at z = 3 m (g/kg)" 
.. ..$ : chr [1, 1] "Relative Humidity at 3 m)" 
.. ..$ : chr [1, 1] "PPFD micromol m-2 s-1" 
.. ..- attr(*, "dim")= int [1:3] 15 1 1 
.. ..- attr(*, "dimnames")=List of 3 
.. .. ..$ : chr [1:15] "DDOY" "Rn" "H" "LE" ... 
.. .. ..$ : NULL 
.. .. ..$ : NULL 
..- attr(*, "dim")= int [1:3] 16 1 1 
..- attr(*, "dimnames")=List of 3 
.. ..$ : chr [1:16] "DDOY" "Rn" "H" "LE" ... 
.. ..$ : NULL 
.. ..$ : NULL 
- attr(*, "header")=List of 3 
..$ description: chr "MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Tue Nov 28 09:51:53 2006             " 
..$ version : chr "5" 
..$ endian : chr "little" 

Из того, что я узнал до сих пор, есть 15 переменных данных, которые описываемый 16-й переменной. Я могу получить доступ к каждой отдельной переменной, набрав:

mlab$DATA[[1]] 
mlab$DATA[[2]] 
mlab$DATA[[3]] 

, который показывает мне значения «десятичного день года», «чистой радиации», «и разумном теплового потока» - как видно из MLAB $ DATA [[ 16]]. Мне нужно сделать, чтобы преобразовать каждую из этих переменных в столбец фрейма данных, сохранив последний список, mlab $ DATA [[16]], в качестве имен столбцов.

Есть ли у кого-нибудь ключи от того, как этого достичь? Большое спасибо заранее за любое направление.

ответ

1

Почему бы не просто извлечь из этого объекта списка?

dat <- as.data.frame(mlab$ DATA[1:15]) 
colnames(dat) <- unlist(mlab$ DATA[16]) 

(Это может показать лучше, если вы берете транспонирование (?t) и использовать широкий экран с options(width=150) ... и использовать круглый 3-х мест.

round(t(dat) , 3) 
+0

Потому что ... я не был» t (и до сих пор нет) знакомы с объектами списка, но ваш ответ сделал все это, спасибо большое. Чтобы сделать окончательную структуру еще более удобной для меня, я использовал colnames (dat) <- unlist (dimnames (mlab $ DATA)) [1:15] вместо переноса кадра данных. Еще раз спасибо за вашу помощь. – thiagoveloso

Смежные вопросы