首页 > 解决方案 > 将 .byte 文件读入 R

问题描述

来自该来源的网格化每日近地表风速数据具有.byt我不熟悉的文件扩展名。

我正在尝试将这些数据读入 R 进行分析,因此想通过纬度和经度来询问它。

我试图将其导入 R 并通过终端浏览数据,但似乎无法找到将完整数据集导入 R 并随后转换为有用格式的方法。

到目前为止,我有以下内容:

to.read = file("~/Near-Surface_Wind_Speed/mcvicar_etal_grl2008/5km/2018/Aust_Wind_5km_20180101_V2.byt", "rb")

readBin(to.read, integer(), n=5, size=2, endian = "little")

但这只给了我 5 个值,没有元数据(即变量名或坐标)

由于我使用的是 mac,然后我打开终端并尝试了以下命令:

od -t x1 Aust_Wind_5km_20180101_V2.byt

它返回了更大的数据图,这里给出了其中的一个子集:

0000000    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0001740    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  0b  0b  0b  0c  0c  0c
0001760    0c  0c  0c  0c  0c  0c  0c  0c  0c  0d  ff  ff  ff  ff  ff  ff
0002000    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0002060    ff  11  ff  ff  11  10  10  10  10  11  11  11  11  11  11  11
0002100    11  11  11  12  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
0002120    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0002660    ff  ff  19  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
0002700    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0003020    ff  ff  ff  19  18  18  19  14  13  13  13  13  13  13  13  13
0003040    13  13  13  13  13  13  13  13  13  13  13  13  13  13  14  14
0003060    14  14  14  14  14  14  14  14  14  14  14  14  14  14  15  19
0003100    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
0003120    ff  ff  ff  ff  1a  14  15  15  15  15  18  ff  ff  ff  ff  ff
0003140    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0003460    ff  ff  ff  0c  0a  08  08  08  08  08  08  08  08  08  08  08
0003500    09  0c  0e  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
0003520    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0003560    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  11  10  0b
0003600    0b  0b  0b  0b  0c  0c  0c  0d  0d  0d  0d  11  12  ff  ff  ff
0003620    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0004340    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  19  15  ff  ff
0004360    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0004520    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  19
0004540    ff  15  12  12  15  19  19  17  14  10  0d  0d  0d  0e  0e  10
0004560    13  0f  0e  0e  0e  0e  0e  0e  0e  0e  0e  0e  0e  0e  0e  0e
0004600    0e  0e  0e  0e  0f  0f  0f  0f  13  17  18  18  19  ff  ff  ff
0004620    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  1a  18  16
0004640    15  12  14  1a  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
0004660    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0005160    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  0c  0b  08
0005200    07  07  07  07  06  08  09  08  09  0b  0e  ff  ff  ff  ff  ff
0005220    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0005300    11  ff  ff  ff  ff  11  10  0d  09  08  08  0a  0d  11  11  12
0005320    12  12  12  12  12  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
0005340    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0006060    ff  ff  ff  ff  ff  19  15  ff  19  19  ff  ff  ff  ff  ff  ff
0006100    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0006240    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  19  19  19  ff  ff  ff
0006260    ff  ff  15  11  11  13  15  13  17  19  14  0e  0e  0e  11  0f
0006300    0e  0e  0e  10  13  13  13  13  13  13  13  13  13  13  13  13
0006320    10  0f  0f  10  10  14  14  17  1a  ff  ff  ff  ff  ff  ff  ff
0006340    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  1a  17  ff  ff  ff  ff
0006360    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0006700    ff  ff  ff  ff  ff  ff  ff  0d  0b  0b  0a  0a  09  09  0b  0d
0006720    0c  0d  0e  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
0006740    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0007000    ff  ff  ff  ff  ff  ff  ff  ff  11  11  11  11  11  10  0e  0c
0007020    0a  09  09  0b  0d  11  12  ff  ff  ff  ff  ff  ff  ff  ff  ff
0007040    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0007600    19  12  15  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
0007620    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0007760    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  19  19  19  ff
0010000    ff  ff  ff  16  13  13  11  0e  10  11  14  12  0f  0e  0f  0e
0010020    0e  10  13  15  14  14  13  15  18  17  14  11  11  10  0f  0f
0010040    10  15  1a  ff  ff  1a  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
0010060    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0010420    ff  0d  0d  0d  0d  0d  0c  0d  ff  0e  ff  ff  ff  ff  ff  ff
0010440    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0010520    11  11  ff  11  10  0c  0b  0a  09  09  0b  0e  10  11  12  ff
0010540    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0011300    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  19  ff  ff  ff  ff  ff
0011320    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff
*
0011500    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  18
0011520    15  18  1a  ff  1a  17  13  11  14  12  0f  0f  0f  0f  0e  0e
0011540    0f  11  13  16  18  17  16  13  13  0f  10  13  14  14  14  17
0011560    16  ff  ff  ff  ff  1a  1a  ff  ff  ff  ff  ff  ff  ff  ff  ff
0011600    ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff  ff

由于这种数据类型对我来说非常新,因此很难产生可重复的问题。对此效果的任何评论都非常受欢迎...@VincentGuillemot 在下面的评论中将我引导至显示以下信息的元数据文件:

clc; clear all;

% Lower left  = 112.000, -44.000 [111.975, -44.025]
% Upper right = 154.000, -10.000 [154.025,  -9.975]
% Number of columns = 841
% Number of rows    = 681



rows=681; cols=841;
filename = 'Aust_Wind_5km_20110528_V2.byt';

M = memmapfile(filename,'Format',{'uint8',[cols rows],'x'});
a=M.Data.x;
a = a./15.875;
A=flipud(rot90(a));
imagesc(A);

看起来这可能有助于确定要读入 R 中每一行/列的项目数。

标签: rdataframebinary

解决方案


当我努力寻找答案时,我想我会为上述数据集发布我的解决方案。

使用@Vincent Guillemot 指出的元数据文件中提供的信息,我们可以看到有 841 行和 681 列具有给定的纬度和经度边界。

所以我们可以使用readBinwhere来读取它n=(681*841)

to.read = file("~/Dropbox/DataSets/Near-Surface_Wind_Speed/mcvicar_etal_grl2008/5km/2018/Aust_Wind_5km_20180101_V2.byt", "rb")
wind <- readBin(to.read, integer(),n=(681*841),size=1,endian="little")
close(to.read)

然后使用data.table包来提高速度,我们可以给表格一个纬度和长列,然后使用ggplot2

library(data.table)
library(ggplot2)

windDT <- as.data.table(wind)
windDT$longitude <- rep(seq(112,154,by=0.05),681)
windDT$latitude <- rep(seq(-10,-44,by=-0.05),each=841)
windDT[wind < 0]$wind = NA

ggplot(windDT,aes(longitude,latitude))+
  geom_raster(aes(fill=wind))+
  scale_fill_continuous(na.value="transparent")+
  coord_fixed(ratio = 1)+
  theme_bw()

推荐阅读