将二进制样本转换为数字

3

我有一个类似于这样的二进制样本:

Z = c(0,0,0,1,0,1,1,1,0,1,0,0,1,0,1,0,1,1,1,0,1,0,1,0)

我想将数字长度为4的所有序列进行转换,即:

我需要读取原始二进制样本,并将所有可能的长度为4的序列转换为数字。

例如: 序列0000将变成1,序列0001将变成2,序列0010将变成3,...,序列1111将变成16。

期望输出应该是由数字1、2、3、…、16组成的新样本,其长度与原始样本相同:

Z = c(0,0,0,1,0,1,1,1,0,1,0,0,1,0,1,0,1,1,1,0,1,0,1,0)

Z1 = c(2,3,6,12,8,15,14,11,5,10,3,11,6,12,8,15,14,11,6,11)

我该如何在R中实现这个功能?

你想用哪种编程语言来实现这个? - Corstian Boerman
4个回答

3

请尝试:

z<-c(0,0,0,1,0,1,1,1,0,1,0,0,1,0,1,0,1,1,1,0,1,0,1,0)
y<-as.character(z)
z1<-sapply(1:(length(y)-3),function(x){strtoi(paste(y[x:(x+3)],collapse=''),2)+1})

[1]  2  3  6 12  8 15 14 11  5 10  3  6 11  6 12  8 15 14 11  6 11

代码的运行方式如下:
  • 将向量z转换为字符向量(y)
  • 对y的长度减3(因为每个数字需要4位数),应用strtoi函数

strtoi函数通过指定输入数字的基数(这里是2,因为它是二进制的)来转换数字。我们加1是因为在二进制中,0000等于0而不是1。

注意:转换为字符是可选的,你可以直接执行

sapply(1:(length(z)-3),function(x){strtoi(paste(z[x:(x+3)],collapse=''),2)+1})

使用vapply也会更快:

vapply(1:(length(z)-3),function(x){strtoi(paste(z[x:(x+3)],collapse=''),2)+1},FUN.VALUE=1)

Unit: microseconds
   expr     min      lq     mean   median      uq     max neval cld
 vapply 206.866 209.111 214.3936 210.0735 211.356 338.362   100  a 
 sapply 230.278 231.882 234.0249 232.8440 234.128 273.897   100   b

3

这里有另外一种方法:

Z <- c(0,0,0,1,0,1,1,1,0,1,0,0,1,0,1,0,1,1,1,0,1,0,1,0)
Z.tmp <- embed(Z,4)
Z1 <- as.vector(Z.tmp %*% c(1,2,4,8) + 1)

2
你可以使用 标签。
library(zoo)
library(compositions)
unbinary(rollapply(z,4, FUN= paste, collapse=''))+1L
#[1]  2  3  6 12  8 15 14 11  5 10  3  6 11  6 12  8 15 14 11  6 11

0

因为你要将4位二进制数转换成十进制数,所以公式如下:

dec = x1 * 2^3 + x2 * 2^2 + x3 * 2^1 + x4 * 2^0

这可以通过R中的扫描乘法来实现

dec <- sum( X * c(8,4,2,1) )

或者向量乘法(如@Greg Snow所示)。

dec <- X %*% c(8,4,2,1)

最后,使用sapply将此计算模式应用于数组的每4个元素,然后整个代码如下。

Z <- c(0,0,0,1,0,1,1,1,0,1,0,0,1,0,1,0,1,1,1,0,1,0,1,0)
Z.len  <- length(Z)

# stand for 2^3, 2^2, 2^1, 2^0
Z.base <- c(8,4,2,1)

res1 <- sapply(1:(Z.len-3), FUN=function(x) sum(Z[x:(x+3)] * Z.base)+1 )
res2 <- sapply(1:(Z.len-3), FUN=function(x) (Z[x:(x+3)] %*% Z.base)+1 )
all.equal(res1, res2)
#[1] TRUE 
res1
# [1]  2  3  6 12  8 15 14 11  5 10  3  6 11  6 12  8 15 14 11  6 11

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