将嵌套列表转换为数据框的R帮助

3
我需要将一个.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"

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

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

这段文字让我展示“年份的十进制天数”、“净辐射”和“感热通量”的值——从mlab$DATA[[16]]中看到。我的任务是将每个变量转换为数据帧列,并将最后一个列表mlab$DATA[[16]]保留为列名。

请问有人知道如何实现吗?非常感谢任何指引。

1个回答

1
为什么不直接从那个列表对象中提取呢?
dat <- as.data.frame( mlab$ DATA[1:15]) 
colnames(dat) <- unlist( mlab$ DATA[16] )

如果你使用转置 (?t) 并且使用宽屏幕 options(width=150) ,可能会显示得更好...并且保留3位小数。

round( t(dat) , 3)

因为我以前不熟悉列表对象(现在还是不太熟悉),所以你的回答帮了我很多。为了让最终结构对我来说更加方便,我使用了colnames(dat) <- unlist(dimnames(mlab$DATA))[1:15],而不是转置数据框。再次感谢您的帮助。 - thiagoveloso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接