【问题标题】:Convert column with hex value into multiple columns with binary value将具有十六进制值的列转换为具有二进制值的多个列
【发布时间】:2014-07-02 00:44:52
【问题描述】:

我有一个数据表,其中有一列包含十六进制数据;我想将其转换为二进制并使用二进制数据创建新列。示例代码,

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 个项目分配给列“Bin_names”的 4 个项目(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

我的实际数据表有大约 1000 万行,所以我正在寻找一种快速的方法来执行此操作。 谢谢,

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    嗯,问题之一似乎是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 经验的人可能会建议一些改进。

    【讨论】:

    • 你也可以像c(Bin_names)一样包装Bin_names
    • dt[,c(Bin_names):=data.table(t(sapply(as.character(dt$HDATA),hex2bin)))] 将是一个小的简化,避免在辅助函数中需要 Vectorize
    • 嗯,这基本上就是Vectorize 所做的;我认为Vectorize 更具可读性。
    猜你喜欢
    • 2023-01-25
    • 1970-01-01
    • 2017-03-11
    • 2020-04-04
    • 2018-11-29
    • 2014-06-22
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多