在矩阵中引用值(扩展)

时间:2014-08-18 00:28:15

标签: r

我有一些来自朋友的R代码,它带有一个数字向量,并且对于每个数字检查这个数字是否相同颠倒。

numbers = (0:9)
upside_down_numbers = c(0,1,NA,NA,NA,NA,9,NA,8,6)
ref_table = rbind(numbers,upside_down_numbers)
invertible = function(n){
   as.numeric(paste0(
    upside_down_numbers[
      1+rev(as.numeric(strsplit(as.character(n),"")[[1]]))
      ],collapse=""))}

如果输入的数字与返回的数字相同,我希望它返回TRUE 例如:

invertible(69)
[1] 69
如果输入的数字与返回的数字不同或返回NA,则输出

和FALSE 例如:

invertible(99)
[66]

我还希望代码能够处理多个数字 例如:

invertible(c(1, 96, 99, 123, 1691))
[1] TRUE TRUE FALSE FALSE TRUE

真的卡在这一点上,会很感激一些建议。谢谢

2 个答案:

答案 0 :(得分:2)

这绝对是一项不寻常的任务......但这对你有用。

invertible_test <- function(n) {
  inverted <- suppressWarnings(invertible(n))
  if (is.na(inverted)) {
    return(FALSE)
  }
  return(n == inverted)
}

invertible_test_vector <- function(v) {
  vapply(v, invertible_test, c(T))
}

这里通过了你的测试:

invertible_test_vector(c(1, 96, 99, 123, 1691))
[1]  TRUE  TRUE FALSE FALSE  TRUE

答案 1 :(得分:1)

这是具有逻辑返回值的invertible函数。看起来这就是你要求的,但不确定。


更新:这是一个比我之前写的更好的功能。并且它在n

上进行了矢量化
invertible <- function(n)
{
    spl <- lapply(strsplit(as.character(n), NULL), rev)
    s <- sapply(spl, function(x) paste(udn[1 + as.numeric(x)], collapse = ""))
    s == n
}

> udn <- c(0, 1, rep(NA, 4), 9, NA, 8, 6)
> n <- c(1, 96, 99, 123, 1691)
> invertible(n)
# [1]  TRUE  TRUE FALSE FALSE  TRUE

但是写一个更好的方法是使用单个数字参数然后使用Vectorize函数

invertible <- Vectorize(function(n) {
    spl <- rev(unlist(strsplit(as.character(n), NULL)))
    paste(udn[1 + as.numeric(spl)], collapse = "") == n
})