- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻求帮助以使用 R
读取二进制文件。
我知道该文件可以使用以下代码在 Python 中成功导入(np for numpy):
dt = np.dtype([('var1', np.uint32), ('var2', np.uint16), ('var3', np.int16),
('var4', np.int16), ('var5', np.int16)])
data = np.fromfile('filename.DAT', dtype=dt)
但是,我不明白如何使用 readBin
在 R
中导入此文件。任何帮助将不胜感激。
最佳答案
很可能已经存在使用 Reticulate 的解决方案来解决这个问题。或 RcppCNPy包。然而,我认为展示你如何做到这一点可能是有教育意义的。
当您使用 readBin
将任意二进制数据读入 R 时,它会将文件读入“原始”向量。这是文件中各个字节的向量。所以你可以这样做:
my_data <- readBin("filename.DAT", "raw", 10e6)
因此将数据导入 R 很容易。困难的部分是解释它。
据我从 numpy 文档中得知,存储在 DAT 中的数据应以小端序的连续字节 block 形式写入。因此,在具有指定格式的文件中,前 4 个字节代表一个 32 位无符号整数,接下来的两个字节显示一个无符号整数,接下来的 6 个字节代表 3 个有符号 16 位整数。然后,此模式将每 12 个字节重复一次,直到文件结束。
这不是 R 中使用的格式,因此需要一些工作才能获取数据。假设您已读取数据,它看起来像这样:
my_data
# [1] 44 5f 93 e8 34 e6 f1 a9 a1 10 35 2e b0 62 c5 7f b7 fd 61 c7 ef 37 a7 21 45 63
# [27] 04 62 de 57 7b 99 7e 30 d3 ab cb 1c b9 69 d2 a6 c8 8e 88 ca 06 7a bb b1 7a dc
# [53] 70 3f 13 1a 51 85 a9 68
如果您想根据表中的数据行查看字节的样子,您可以这样做:
t(matrix(my_data, nrow = 12))
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
# [1,] 44 5f 93 e8 34 e6 f1 a9 a1 10 35 2e
# [2,] b0 62 c5 7f b7 fd 61 c7 ef 37 a7 21
# [3,] 45 63 04 62 de 57 7b 99 7e 30 d3 ab
# [4,] cb 1c b9 69 d2 a6 c8 8e 88 ca 06 7a
# [5,] bb b1 7a dc 70 3f 13 1a 51 85 a9 68
这意味着你的二进制数据应该这样解释:
# <-----var1--------> <-var2--> <-var3--> <-var4--> <-var5->
# 44 5f 93 e8 | 34 e6 | f1 a9 | a1 10 | 35 2e <- row 1
# b0 62 c5 7f | b7 fd | 61 c7 | ef 37 | a7 21 <- row 2
# 45 63 04 62 | de 57 | 7b 99 | 7e 30 | d3 ab <- row 3
# cb 1c b9 69 | d2 a6 | c8 8e | 88 ca | 06 7a <- row 4
# bb b1 7a dc | 70 3f | 13 1a | 51 85 | a9 68 <- row 5
所以如果我们首先从这个矩阵创建一个数据框:
df <- as.data.frame(t(matrix(as.numeric(my_data), nrow = 12)))
我们现在可以根据文件的已知结构重新创建变量:
# Make our 32-bit numbers
var1 <- df$V1 + 2^8 * df$V2 + 2^16 * df$V3 + 2^24 * df$V4
# Make our 16-bit numbers
var2 <- df$V5 + 2^8 * df$V6
var3 <- df$V7 + 2^8 * df$V8
var4 <- df$V9 + 2^8 * df$V10
var5 <- df$V11 + 2^8 * df$V12
# Interpret our var3, 4 and 5 as signed rather than unsigned
var3 <- ifelse(var3 < 2^15, var3, var3 - 2^16)
var4 <- ifelse(var4 < 2^15, var4, var4 - 2^16)
var5 <- ifelse(var5 < 2^15, var5, var5 - 2^16)
# Store as a data frame
df <- data.frame(var1 = var1, var2 = var2, var3 = var3, var4 = var4, var5 = var5)
这意味着我们得到了对字节数据的以下解释:
df
#> var1 var2 var3 var4 var5
#> 1 3901972292 58932 -22031 4257 11829
#> 2 2143642288 64951 -14495 14319 8615
#> 3 1644454725 22494 -26245 12414 -21549
#> 4 1773739211 42706 -28984 -13688 31238
#> 5 3699028411 16240 6675 -31407 26793
因此,假设您的数据完全符合您指定的格式,以下函数应将其提取为数据框:
read_numpy_data <- function(path, max_file_size = 10e6)
{
my_data <- readBin(path, "raw", max_file_size)
df <- as.data.frame(t(matrix(as.numeric(my_data), nrow = 12)))
as_sign <- function(x, y) {(x + 2^8 * y) -> z; ifelse(z < 2^15, z, z - 2^16)}
data.frame(var1 = df$V1 + 2^8 * df$V2 + 2^16 * df$V3 + 2^24 * df$V4,
var2 = df$V5 + 2^8 * df$V6,
var3 = as_sign(df$V7, df$V8),
var4 = as_sign(df$V9, df$V10),
var5 = as_sign(df$V11, df$V12))
}
关于用 R 读取二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59809279/
我遇到以下问题。我想读取一个包含数百万行和数百列的大型 csv。我想向下转换列的数据类型。我的方法是读取 csv,然后使用 pd.to_numeric() 对其进行向下转换。我不知道列数及其类型。在读
目前,我从 SQL server (2008) 数据库获取数据。 cyurrent的方法是使用DataTable,然后将其传递并使用。 if (parameters != null)
我有以下问题。我有一个巨大的 csv 文件,想用多处理加载它。对于一个包含 500000 行和 130 列不同数据类型的示例文件,Pandas 需要 19 秒。我试过 dask 因为我想多处理阅读。但
是否有关于用于序列化各种 MFC 数据结构的二进制格式的明确文档?我已经能够在十六进制编辑器中查看我自己的一些类,并使用 Java 的 ByteBuffer 类读取它们(使用自动字节顺序转换等)。 但
我正在使用 Selenium 进行测试,我们用 HTML 文件编写测试用例,并用它们制作测试套件,我们的要求是编写足够健壮的测试用例,以根据测试环境改变自身。 为此,我不希望在 HTML 脚本本身中包
我需要一个 JavaScript 代码来读取存储为 .txt 文件的字典(或者也可以保存为任何其他类型的文件。它也可以在线获得)并将其内容存储在一个变量中。我不能找到一种让 JavaScript 像
我正在尝试遍历包含 SSH 登录和其他日志的日志文本文件。 程序正在返回 SSH 登录的总数。 我的解决方案确实有效,但似乎有点慢(在 200mo 文件上大约需要 3.5 秒)。我想知道是否有任何方法
我正在将大量数据从一个电子表格复制到工作簿中的其他 160 个电子表格。目前,Excel (2013) 遇到错误,因为它没有足够的资源来完成操作。 我的目标是将工作表 4 中 V13:XI1150 范
我正在尝试读取一个有 1147 行的文本文件。下面的代码仅读取第 1050-1147 行。我的目标是读取整个文件并提取位于不同行的特定值以在脚本中使用。一个示例是包含“BlockList: 2”的行中
我正在为游戏编写解释器。用户将其移动输入解释器,程序执行该移动。 现在我想为每个决定实现一个时间限制。玩家不应该能够思考超过 30 秒来写一个移动并按下回车。 call_with_time_limit
以this file例如,我正在尝试读取 data.frame 中的数据。来自 the doc (pdf 文件,表 1),它遵循一些 fortran 约定。我尝试了以下但收效甚微: dir 0' 将
我正在使用 R 阅读 Outlook 附件。我的引用在这里:Download attachment from an outlook email using R 这是我的电子邮件的截图: 这每天都会发送
我不会从表格中读取行来将主题放在列表中 php脚本 $url_obj='http://'.$host.':8069/xmlrpc/object'; $sock=new xmlrpc_client($u
我有一个这样的 csv 文件: id,name,value 1,peter,5 2,peter\,paul,3 我如何读取此文件并告诉 R "\," 不表示新列,仅表示 ","。 我必须添加该文件
我正在尝试读取 ~/Library/Preferences/com.apple.mail.plist (在 Snow Leopard 上)以获取电子邮件地址和其他信息以进入“关于”对话框。我使用以下代
This question already has answers here: How do I use floating-point division in bash? (19个回答) 5个月前关闭
本练习的目标是读取输入文件并将其存储到表中,然后验证输入中的某些字段并输出任何错误记录。我需要读取并存储每个策略组,以便表中一次仅存储 5 条记录,而不是整个文件。 所以我需要读取一个包含 5 条记录
据我了解,LWT 插入始终以 SERIAL 一致性级别完成。如果为 true,这是否意味着读取作为 LWT 插入的行可以安全地以 ANY 的一致性级别读取? 换句话说,我假设 LWT 插入是完全一致的
我看到很多很多通过java脚本读取cookie的函数,但我只想在变量中使用它一次,我是JS新手。 这是我的代码 var TheNumber = (Math.random() + '') * 10000
我正在使用 asp.net 和 C#。我在服务器上部署了一个应用程序[已发布],现在我想查看该网站的代码,据我所知,我可以阅读程序集来查看代码。 请告诉我如何实现它。 提前致谢。 最佳答案 您可以使用
我是一名优秀的程序员,十分优秀!