R - 帮助将嵌套列表(?)转换为data.frame

时间:2014-12-05 00:14:50

标签: r matlab list nested dataframe

我需要将.mat(Matlab)数据文件导入R并将其内容组织为数据帧。虽然通过使用R.matlab包进行直接导入,但转换到数据框显示很难,因为数据最初是以某种笨拙的方式组织的。看起来有两个嵌套列表。到目前为止,我还无法将其转换为数据框。

这是我到目前为止所做的:

# 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"

根据我到目前为止所学到的,有16个数据变量由第16个变量描述。我可以通过输入以下内容来访问每个变量:

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

显示了'十进制日','净辐射','和显热通量'的值 - 从mlab $ DATA [[16]]中可以看出。我需要做的是将每个变量转换为数据框列,保留最后一个列表mlab $ DATA [[16]]作为列的名称。

有没有人知道如何实现这一目标?非常感谢任何方向。

1 个答案:

答案 0 :(得分:1)

为什么不从该列表对象中提取?

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

(如果您使用转置(?t)并使用带有options(width=150)的宽屏幕,则可能会显示得更好...并使用圆形到3个位置。

round( t(dat) , 3)