如何使用R?
将整数转换为二进制向量例如:
number <- 11
[1] 1 0 1 1
如果我需要将整个数字向量(最小值= 0,最大值= 300)转换为二进制矩阵,那么最快的转换方法(使用R代码或包中的某些现有函数)是什么?
答案 0 :(得分:23)
有intToBits
函数将任何整数转换为32个raw的向量,所以你可以这样做:
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
答案 1 :(得分:19)
此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
答案 2 :(得分:7)
我在M. J. 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]
}
答案 3 :(得分:6)
尝试CRAN包&#34; binaryLogic&#34;
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
也可用:shift,rotate,graycode等。
答案 4 :(得分:5)
您可以根据intToBit
:
intToBitVect <- function(x){
tmp <- rev(as.numeric(intToBits(x)))
id <- seq_len(match(1,tmp,length(tmp))-1)
tmp[-id]
}
第一行将intToBits输出转换为数字0和1,并将顺序直接放置。第二行检查需要保留的值,如下所示:
match
检查前1位的位置。如果找不到1,则要求match
返回tmp
向量的长度。seq_len
)到1
向量中tmp
第一次出现之前的位置tmp
向量显示它有效:
> intToBitVect(11)
[1] 1 0 1 1
> intToBitVect(0)
[1] 0
答案 5 :(得分:2)
如果你想返回一个二进制序列,即一个1和0的向量,那么这个函数会为你做这个,但它一次只能取一个数。
dectobin <- function(y) {
# find the binary sequence corresponding to the decimal number 'y'
stopifnot(length(y) == 1, mode(y) == 'numeric')
q1 <- (y / 2) %/% 1
r <- y - q1 * 2
res = c(r)
while (q1 >= 1) {
q2 <- (q1 / 2) %/% 1
r <- q1 - q2 * 2
q1 <- q2
res = c(r, res)
}
return(res)
}
答案 6 :(得分:2)
另一个:
add_action('template_redirect','chk_404_redirect');
function chk_404_redirect() {
if(is_404()) {
wp_redirect( home_url() ); exit;
}
}
答案 7 :(得分: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
}
答案 8 :(得分:0)
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"
答案 9 :(得分:0)
这是一个 Rcpp 实现。
在 Rstudio 中,将以下代码保存在文件中,例如 binary.cpp
,然后键入 Source。
//************************
// binary.cpp
#include <RcppArmadillo.h>
//' @Title get the binary representation of a positive integer
// [[Rcpp::depends(RcppArmadillo)]]
//[[Rcpp::export]]
void intToBinary(int n, arma::vec& a ) {
for(int i=0;n>0;i++){
a[i]=n%2;
n=n/2;
}
}
//************************
如果 Source 顺利,则来自 R 控制台类型
> a <- rep(0,10) # needed to store the binary representation
> myInt <- 5 # to be converted to binary form
> intToBinary(myInt, a)
> rev(a) # print in the usual form