将二进制字符串转换为十进制

5

我有一个二进制转十进制的问题。假设我有一个二进制模式如下:

pattern<-do.call(expand.grid, replicate(5, 0:1, simplify=FALSE))
pattern
   Var1 Var2 Var3 Var4 Var5
1     0    0    0    0    0
2     1    0    0    0    0
3     0    1    0    0    0
4     1    1    0    0    0
5     0    0    1    0    0
6     1    0    1    0    0
7     0    1    1    0    0
8     1    1    1    0    0
9     0    0    0    1    0
10    1    0    0    1    0
11    0    1    0    1    0
12    1    1    0    1    0
13    0    0    1    1    0
14    1    0    1    1    0
15    0    1    1    1    0
16    1    1    1    1    0
17    0    0    0    0    1
18    1    0    0    0    1
19    0    1    0    0    1
20    1    1    0    0    1
21    0    0    1    0    1
22    1    0    1    0    1
23    0    1    1    0    1
24    1    1    1    0    1
25    0    0    0    1    1
26    1    0    0    1    1
27    0    1    0    1    1
28    1    1    0    1    1
29    0    0    1    1    1
30    1    0    1    1    1
31    0    1    1    1    1
32    1    1    1    1    1

我想知道在R中将每一行转换为十进制值的最简单方法是什么?例如:

00000->0
10000->16
...
01111->15

1
顺便说一下,在你创建数据的步骤中,do.call 是不必要的。 - A5C1D2H2I1M1N2O1R2T1
2个回答

8

尝试:

res <- strtoi(apply(pattern,1, paste, collapse=""), base=2)
res
#[1]  0 16  8 24  4 20 12 28  2 18 10 26  6 22 14 30  1 17  9 25  5 21 13 29  3
#[26] 19 11 27  7 23 15 31

您可以尝试使用 intToBits 将其转换回 二进制

 pat2 <- t(sapply(res, function(x) as.integer(rev(intToBits(x)))))[,28:32]
 pat1 <- as.matrix(pattern)
 dimnames(pat1) <- NULL
identical(pat1, pat2)
#[1] TRUE

谢谢,akrun!您知道如何将整数反转为模式格式吗? - David Z
strtoi()是向量化的。不需要使用apply()函数:strtoi(do.call(paste0, as.data.frame(pattern)), base = 2)(仍然比@nicola慢)。 - undefined

4

您可以尝试以下方法:

    as.matrix(pattern) %*% 2^((ncol(pattern)-1):0)

谢谢,尼古拉。你知道如何将十进制数反转为二进制模式吗? - David Z
1
如果res是从我的代码行中获得的结果,请尝试使用matrix((rep(res,each=5) %/% (2^(4:0)) %%2),ncol=5,byrow=TRUE)。假设您的数字有5个二进制位。 - nicola
3
我只想指出,虽然@akrun的解决方案肯定是有效的,但它可能比我的慢上数百倍。 - nicola
尼古拉,如果你能添加一份解释说明这个解决方案是如何工作的,那将非常有用。 - Mars

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接