R 列出所有1位数字完全不同的数字

R 列出所有1位数字完全不同的数字,r,R,假设我有一个号码: a<-11121 以下是一些解决方案: 1)replace_ith将a中的第i位数字替换为1(如果是2)和2(如果是1)。将其应用于每个数字: replace_ith <- function(i, a) { ch <- strsplit(as.character(a), "")[[1]] ch[i] <- if (ch[i] == "1") "2" else "1" as.numeric(paste(ch, collapse = ""))

假设我有一个号码:

a<-11121

以下是一些解决方案:

1)
replace_ith
a
中的第i位数字替换为1(如果是2)和2(如果是1)。将其应用于每个数字:

replace_ith <- function(i, a) {
  ch <- strsplit(as.character(a), "")[[1]]
  ch[i] <- if (ch[i] == "1") "2" else "1"
  as.numeric(paste(ch, collapse = ""))
}

a <- 11121
sapply(1:nchar(a), replace_ith, a)
2)这里是
替换为
的第二种可能的实现方式:

replace_ith <- function(i, a) {
  a <- as.character(a)
  substr(a, i, i) <- if (substr(a, i, i) == "1") "2" else "1"
  as.numeric(a)
}

下面是一个答案,它是纯数字形式的,并且矢量化为一行:

(2 * a %/% (b <- 10^(1:5))) * b +
  ((2 * a) %% (b / 10)) +
  0.3 * b - a
下面是第二种更简洁的版本,使用纯数值方法:

a %>% rep(5) %>% outer(4:0, function(x, y) x %/% (10 ^ y) %% 10) %>%
  `diag<-`(., 3 - diag(.)) %>% `%*%`(10 ^ (0:4))

是的,很抱歉我添加了:)
replace_ith <- function(i, a) {
  (a %/% 10^i) * 10^i + 10^(i-1) * ( 3 - (a %% 10^i) %/% 10^(i-1) ) + a %% 10^(i-1)
}
(2 * a %/% (b <- 10^(1:5))) * b +
  ((2 * a) %% (b / 10)) +
  0.3 * b - a
a %>% as.character %>% strsplit("") %>%
  unlist %>% as.numeric %>% matrix(5, 5) %>%
  `diag<-`(., 3 - diag(.)) %>% t %>% `%*%`(10 ^ (4:0))
a %>% rep(5) %>% outer(4:0, function(x, y) x %/% (10 ^ y) %% 10) %>%
  `diag<-`(., 3 - diag(.)) %>% `%*%`(10 ^ (0:4))
as.character(a) %>% strsplit("") %>% {.[[1]] == "2"} %>%
  multiply_by_matrix(2 ^ (4:0)) %>% bitwXor(2 ^ (4:0)) %>%
  intToBin %>% as.integer(.) + 11111