我有一个像这样的二进制字符串:
0010000
我希望拥有所有这些排列:
1010000
0110000
0011000
0010100
0010010
0010001
有人知道R中的哪个功能可以给我这些结果吗?
答案 0 :(得分:1)
我们假设问题是连续替换输入中的每个0,输入字符串为0和1。
使用"1"
连续替换每个字符,无论其值如何,然后删除与输入相等的结果的任何组件。没有包使用。
input <- "0010000"
setdiff(sapply(1:nchar(input), function(i) `substr<-`(input, i, i, "1")), input)
## [1] "1010000" "0110000" "0011000" "0010100" "0010010" "0010001"
更新:已经完全修改了答案。
答案 1 :(得分:1)
library(stringr)
bin <- '0010000'
ones <- str_locate_all(bin, '1')[[1]][,1]
zeros <- (1:str_length(bin))[-ones]
sapply(zeros, function(x){
str_sub(bin, x, x) <- '1'
bin
})
[1] "1010000" "0110000" "0011000" "0010100" "0010010" "0010001"
答案 2 :(得分:1)
R具有按位运算功能,因此我们可以使用bitwOr
:
bitwOr(16, 2^(6:0))
#> [1] 80 48 16 24 20 18 17
...或者如果我们想要排除原文,
setdiff(bitwOr(16, 2^(6:0)), 16)
#> [1] 80 48 24 20 18 17
但是,它只适用于十进制,而不是二进制。不过那没关系;我们可以构建一些转换函数:
bin_to_int <- function(bin){
vapply(strsplit(bin, ''),
function(x){sum(as.integer(x) * 2 ^ seq(length(x) - 1, 0))},
numeric(1))
}
int_to_bin <- function(int, bits = 32){
vapply(int,
function(x){paste(as.integer(rev(head(intToBits(x), bits))), collapse = '')},
character(1))
}
现在:
input <- bin_to_int('0010000')
output <- setdiff(bitwOr(input, 2^(6:0)),
input)
output
#> [1] 80 48 24 20 18 17
int_to_bin(output, bits = 7)
#> [1] "1010000" "0110000" "0011000" "0010100" "0010010" "0010001"