r - 将二进制样本转换为数字

标签 r binary numbers

我有一个像这样的二进制样本:

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 中做到这一点?

最佳答案

试试:

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

关于r - 将二进制样本转换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33828682/

相关文章:

r - 在 r 中循环列的优雅方法

r - 通过 dplyr 中的动态列名进行汇总

java - java中带分隔符的2个或多个数字

python - 如何在 Jupyter Notebook Python 3.6.2 中关闭行号

R:rCharts 和 Shiny:人力车图不会显示

mysql - 如何在不授予 INSERT 权限的情况下在 dplyr 中创建 left_join(..., copy=TRUE)

Python 将文件中的行拆分为两个单独的列表

c++ - 如何做一个真正的strtoul?不会摄入实际的字符串

c++ - 从 C++ 文件中读取 ASCII 码和二进制码

java - 如何在 Java 中舍入 *down* 整数?