Rを使用して整数をバイナリベクトルに変換するにはどうすればよいですか?
例えば :
number <- 11
[1] 1 0 1 1
数値のベクトル全体(最小値= 0、最大= 300)を2進行列に変換する必要がある場合、(Rコードまたはパッケージの既存の関数を使用して)可能な限り最速の変換方法は何ですか?
ウサギに従ってください:
base::intToBits
Rを使用して整数をバイナリベクトルに変換するにはどうすればよいですか?
例えば :
number <- 11
[1] 1 0 1 1
数値のベクトル全体(最小値= 0、最大= 300)を2進行列に変換する必要がある場合、(Rコードまたはパッケージの既存の関数を使用して)可能な限り最速の変換方法は何ですか?
ウサギに従ってください:
base::intToBits
任意の整数を 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
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
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
シフト、回転、グレーコードなども利用できます。
そのために、以下に基づいて次の関数を使用できます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行目は、次のように、保持する必要のある値を確認します。
match
ます。1が見つからない場合は、ベクトルmatch
の長さを返すように要求します。tmp
seq_len
1からベクトル1
内の最初の出現の前の位置までのシーケンスを(を使用して)作成しますtmp
tmp
ベクトル内のそれらすべての位置をドロップしますそれが機能することを示すために:
> intToBitVect(11)
[1] 1 0 1 1
> intToBitVect(0)
[1] 0
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]
}
これを取得するために実際に関数を呼び出す必要はありません。剰余算術だけで答えを得ることができます。
int_to_binary <- function(num, pow) {
if(2^(pow + 1) - 1 < num) stop("Use a higher values of 'pow'")
num %/% (2^(pow:0)) %% 2
}
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"