23

Rを使用して整数をバイナリベクトルに変換するにはどうすればよいですか?

例えば ​​:

number <- 11
[1] 1 0 1 1

数値のベクトル全体(最小値= 0、最大= 300)を2進行列に変換する必要がある場合、(Rコードまたはパッケージの既存の関数を使用して)可能な限り最速の変換方法は何ですか?

ウサギに従ってください: base::intToBits

4

10 に答える 10

29

任意の整数を 32 個の raw のベクトルに変換するintToBits関数があるので、これを行うことができます。

decimals <- c(3,5,11,4)
m <- sapply(decimals,function(x){ as.integer(intToBits(x))})
m

> m
      [,1] [,2] [,3] [,4]
 [1,]    1    1    1    0
 [2,]    1    0    1    0
 [3,]    0    1    0    1
 [4,]    0    0    1    0
 [5,]    0    0    0    0
 [6,]    0    0    0    0
 [7,]    0    0    0    0
 [8,]    0    0    0    0
 [9,]    0    0    0    0
[10,]    0    0    0    0
[11,]    0    0    0    0
[12,]    0    0    0    0
[13,]    0    0    0    0
[14,]    0    0    0    0
[15,]    0    0    0    0
[16,]    0    0    0    0
[17,]    0    0    0    0
[18,]    0    0    0    0
[19,]    0    0    0    0
[20,]    0    0    0    0
[21,]    0    0    0    0
[22,]    0    0    0    0
[23,]    0    0    0    0
[24,]    0    0    0    0
[25,]    0    0    0    0
[26,]    0    0    0    0
[27,]    0    0    0    0
[28,]    0    0    0    0
[29,]    0    0    0    0
[30,]    0    0    0    0
[31,]    0    0    0    0
[32,]    0    0    0    0
于 2012-08-23T09:09:58.967 に答える
23

This SO postは機能を示唆していintToBitsます。関数 を定義します。この関数には、返されるビット数を制御number2binaryする引数が含まれています。noBits標準では 32 ビットを返します。

number2binary = function(number, noBits) {
       binary_vector = rev(as.numeric(intToBits(number)))
       if(missing(noBits)) {
          return(binary_vector)
       } else {
          binary_vector[-(1:(length(binary_vector) - noBits))]
       }
    }

そしていくつかの例について:

> number2binary(11)
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1
> number2binary(11, 4)
[1] 1 0 1 1
于 2012-08-23T09:04:23.670 に答える
13

CRANパッケージ「binaryLogic」を試す

library(binaryLogic)

as.binary(11)
[1] 1 0 1 1

as.binary(11, littleEndian=TRUE)
[1] 1 1 0 1

as.binary(42, n=16)
[1] 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0

as.binary(0:2, n=2)
[[1]]
[1] 0 0

[[2]]
[1] 0 1

[[3]]
[1] 1 0

as.binary(0xFF)
[1] 1 1 1 1 1 1 1 1

シフト、回転、グレーコードなども利用できます。

于 2017-02-04T15:52:03.683 に答える
7

そのために、以下に基づいて次の関数を使用できますintToBit

intToBitVect <- function(x){
  tmp <- rev(as.integer(intToBits(x)))
  id <- seq_len(match(1,tmp,length(tmp))-1)
  tmp[-id]
}

最初の行は、intToBits出力を数値の0と1に変換し、順序をまっすぐにします。2行目は、次のように、保持する必要のある値を確認します。

  • を使用して、最初の1が発生する場所を確認しmatchます。1が見つからない場合は、ベクトルmatchの長さを返すように要求します。tmp
  • seq_len1からベクトル1内の最初の出現の前の位置までのシーケンスを(を使用して)作成しますtmp
  • tmpベクトル内のそれらすべての位置をドロップします

それが機能することを示すために:

> intToBitVect(11)
[1] 1 0 1 1
> intToBitVect(0)
[1] 0
于 2012-08-23T09:24:35.373 に答える
7

MJ Crawley による「The R Book」で見つけた解決策は、次の関数です。

binary <- function(x) {
  i <- 0
  string <- numeric(32)
  while(x > 0) {
    string[32 - i] <- x %% 2
    x <- x %/% 2
    i <- i + 1 
  }
  first <- match(1, string)
  string[first:32] 
}
于 2014-10-13T18:18:18.877 に答える
2

これを取得するために実際に関数を呼び出す必要はありません。剰余算術だけで答えを得ることができます。

int_to_binary <- function(num, pow) {
  if(2^(pow + 1) - 1 < num) stop("Use a higher values of 'pow'")
  num %/% (2^(pow:0)) %% 2
}
于 2020-02-24T15:57:09.617 に答える
1
intToBin <- function(x){
  if (x == 1)
    1
  else if (x == 0)
    NULL
  else {
   mod <- x %% 2
   c(intToBin((x-mod) %/% 2), mod)
  }
}

したがって、 intToBin(10) が返されます

[1] "1" "0" "1" "0"

そして、ベクトルの代わりに文字列が必要な場合

> paste0(intToBin(10), collapse = "")
[1] "1010"
于 2016-12-20T03:23:25.767 に答える