我有一个二进制字符串的向量:
a<-c(0,0,0,1,0,1)
我想将此向量转换为十进制。
我尝试使用compositions
包和unbinary()
函数,但是,此解决方案以及我在此网站上找到的大多数其他解决方案都需要使用g-adic字符串作为输入参数。
我的问题是如何将矢量而不是字符串转换为十进制?
说明问题:
library(compositions)
unbinary("000101")
[1] 5
这给出了正确的解决方案,但是:
unbinary(a)
unbinary("a")
unbinary(toString(a))
产生NA。
答案 0 :(得分:7)
您可以尝试此功能
bitsToInt<-function(x) {
packBits(rev(c(rep(FALSE, 32-length(x)%%32), as.logical(x))), "integer")
}
a <- c(0,0,0,1,0,1)
bitsToInt(a)
# [1] 5
这里我们跳过字符转换。这仅使用base
个函数。
很可能
unbinary(paste(a, collapse=""))
如果您仍想使用该功能,那么会有效。
答案 1 :(得分:5)
有一个单线解决方案:
Reduce(function(x,y) x*2+y, a)
说明:
扩展Reduce
的应用程序会产生类似的结果:
Reduce(function(x,y) x*2+y, c(0,1,0,1,0)) = (((0*2 + 1)*2 + 0)*2 + 1)*2 + 0 = 10
随着下一个新位的出现,我们将到目前为止的累计值加倍,然后将下一位添加到其中。
另请参阅Reduce()
功能的说明。
答案 2 :(得分:4)
如果您想坚持使用合成,只需将您的矢量转换为字符串:
library(compositions)
a <- c(0,0,0,1,0,1)
achar <- paste(a,collapse="")
unbinary(achar)
[1] 5
答案 3 :(得分:2)
这个功能可以解决问题。
bintodec <- function(y) {
# find the decimal number corresponding to binary sequence 'y'
if (! (all(y %in% c(0,1)))) stop("not a binary sequence")
res <- sum(y*2^((length(y):1) - 1))
return(res)
}