我是R的新手,正在尝试了解函数的apply系列。具体来说,我正在尝试编写一个高阶函数,该函数将接受2个字符向量“host”和“guest”(它们的长度不必相同),并向我返回一个与“host”长度相同的索引向量”,其结果元素对应于其在 guest 中的索引(如果不存在,则为NA)。

host <- c("A","B","C","D")
guest <- c("D","C","A","F")

matchIndices <- function(x,y)
{
  return(match(x,y))
}

此代码按预期返回3:
matchIndices(host[1],guest)

这是我希望能够用简洁的apply函数(sapply?)替换的循环。
for (i in 1:length(host))
{ idx <- matchIndices(host[i],guest);
  cat(paste(idx,host[i],"\n",sep=";"))
}

这段代码“起作用”是因为它产生下面的输出,但是我确实希望结果是一个向量,并且我有一种直觉,认为apply函数之一可以解决问题。我只是在写它。非常感激任何的帮助。谢谢。

3; A;
NA; B;
2; C;
1; D;

最佳答案

host <- c("A","B","C","D")
guest <- c("D","C","A","F")

matchIndices <- function(x,y) {
    return(match(x,y))
}

一种(低效的)方法是在sapply向量上进行host,将guest作为参数传递(注意,您可以将其简化为sapply(host, match, guest),但这说明了处理此类问题的通用方法):
> sapply(host, matchIndices, guest)
 A  B  C  D
 3 NA  2  1

但是,这可以直接使用match来完成,因为它接受向量第一个参数:
> match(host, guest)
[1]  3 NA  2  1

如果您要使用命名向量作为输出,
> matched <- match(host, guest)
> names(matched) <- host
> matched
 A  B  C  D
 3 NA  2  1

可以包装成一个函数
matchIndices2 <- function(x, y) {
    matched <- match(x, y)
    names(matched) <- x
    return(matched)
}

返回
> matchIndices2(host, guest)
 A  B  C  D
 3 NA  2  1

如果您确实希望将名称和匹配项组合成一个字符串向量,则:
> paste(match(host, guest), host, sep = ";")
[1] "3;A"  "NA;B" "2;C"  "1;D"

关于r - 如何向量化此函数以返回索引向量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4736858/

10-16 07:18
查看更多