我有一个包含十六进制数据的列的数据表;我想将其转换为二进制文件并使用二进制数据创建新列。示例代码,
library(data.table)
library(BMS)
# Create a data table
dt <- data.table(Z=c(1:4),
HDATA=c("1234","5678","9ACB","DEF0"))
# Convert the HDATA column to binary
Bin_names <- sapply(c(15:0), function(x) paste0('C',x))
dt[,Bin_names:=hex2bin(as.character(HDATA)),]
然而,这给了我以下错误消息,
警告讯息:
在[.data.table
(dt ,, :=
(Bin_names,hex2bin(as.character(HDATA)))中,:
提供了76个项目,分配给4个栏目的Bin_names&#39; (72未使用)
,修改后的数据表如下所示,
> dt
Z HDATA Bin_names
1: 1 1234 0
2: 2 5678 0
3: 3 9ACB 0
4: 4 DEF0 1
>
如何让这个给我一个看起来像这样的输出,
Z HDATA C15 C14 C13 C12 C11 C10 C9 C8 C7 C6 C5 C4 C3 C2 C1 C0
1: 1 1234 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0
2: 2 5678 0 1 0 1 0 0 1 1 0 1 1 1 1 0 0 0
3: 3 9ABC 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0
4: 4 DEF0 1 1 0 1 1 1 1 0 1 1 1 1 0 0 0 0
我的实际数据表大约有10M行,所以我正在寻找一种快速的方法来执行此操作。 谢谢,
答案 0 :(得分:3)
好吧,似乎其中一个问题是hex2bin
似乎没有正确地进行矢量化。它返回一个向量,每个输入有16个值。我们真的想分开分开每个号码。并且似乎data.table
:=
运算符喜欢在赋值的右侧有一个列表,而不是我可以告诉的矩阵。所以让我们定义一个辅助函数
bincols<-function(x) {
y <- t(Vectorize(hex2bin)(as.character(x)))
c(unname(as.data.table(y)))
}
这将创建一个包含16个元素的列表,其中每个元素都是0/1的向量,用于传递给函数的每个值。然后我们可以将它与你的赋值命令
一起使用dt[, c(Bin_names) := bincols(HDATA)]
所以这似乎有效。我有一种感觉,我所做的一些转变可能是不必要的,所以可能有更多data.table
经验的人可能会提出一些改进。