查找给定元素的索引;如果给定元素未出现,则查找NA

时间:2020-10-18 12:52:04

标签: r function

我在一个问题上呆了几个小时。如果您有任何解决办法的想法,非常感谢。

因此,我正在尝试学习如何编写一个函数f,该函数采用输入(数字)向量'vec'和一个整数'int'。

基本上,该函数应返回“ int”出现在“ vec”中的位置,如果“ int”没有出现在“ vec”中,则该函数应返回“ NA”。

所有这些都使用循环“ for”。

最后,输出

sapply(1:4, function(x) print(f3(c(3, 3, 3, 2, 2, 1), x))) is

#    ```
#    [1] 6
#    [1] 4 5
#    [1] 1 2 3
#    NULL

这是我的代码,但是我被困在这里,看不到解决问题的方法。

    f <- function(vec, int) {
  for (i in vec) 
    check <- vec[]== int 
  which(int == vec)
}

2 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

f <- function(vec, int){
  if(all(vec != int)) return(NA)
  
  for(i in vec){
    if(i == int) return(which(vec == i))
  }
}

然后您可以通过以下方法检查其是否有效:

vect <- sample(1:10, 1000, replace = T)
inte <- 10

f(vect, inte)

答案 1 :(得分:0)

您所描述的本质上是which已经完成的工作。唯一的区别是,在没有命中的情况下,which会返回integer(0)(即一个空向量),而不是NA

因此,您需要在f中调用which并“修复”结果:

f = function (vec, x) {
    result = which(vec, x)
    if (length(result) == 0L) NA_integer_ else result
}

代码if (length(…) == 0L) ‹A› else ‹B›很常见,人们经常为它定义一个特定的运算符:

`%||%` = function (a, b) {
    if (length(a) == 0L) b else a
}

使用该功能,您可以大大简化f(和类似功能):

f = function (vec, x) {
    which(vec, x) %||% NA_integer_
}