我有一个二进制字符串的向量:
a<-c(0,0,0,1,0,1)
Run Code Online (Sandbox Code Playgroud)
我想将此向量转换为十进制.
我尝试使用compositions包和unbinary()函数,但是,此解决方案以及我在此站点上找到的大多数其他解决方案都需要g-adic字符串作为输入参数.
我的问题是如何将矢量而不是字符串转换为十进制?
说明问题:
library(compositions)
unbinary("000101")
[1] 5
Run Code Online (Sandbox Code Playgroud)
这给出了正确的解决方案,但是:
unbinary(a)
unbinary("a")
unbinary(toString(a))
Run Code Online (Sandbox Code Playgroud)
产生NA.
你可以尝试这个功能
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
Run Code Online (Sandbox Code Playgroud)
这里我们跳过字符转换.这只使用base功能.
可能就是这样
unbinary(paste(a, collapse=""))
Run Code Online (Sandbox Code Playgroud)
如果您仍然想要使用该功能,那会有用吗
有一个单线解决方案:
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()功能说明.