我是R的新手,我正试图处理apply函数系列.具体来说,我正在尝试编写一个高阶函数,它将接受2个字符向量,"host"和"guest"(不需要相同的长度),并返回一个与"host"相同长度的索引向量",结果元素对应于客人的指数(如果不存在,则为NA).
host <- c("A","B","C","D")
guest <- c("D","C","A","F")
matchIndices <- function(x,y)
{
return(match(x,y))
}
Run Code Online (Sandbox Code Playgroud)
此代码按预期返回3:
matchIndices(host[1],guest)
Run Code Online (Sandbox Code Playgroud)
这是我希望能够用简洁的apply函数替换的循环(sapply?)
for (i in 1:length(host))
{ idx <- matchIndices(host[i],guest);
cat(paste(idx,host[i],"\n",sep=";"))
}
Run Code Online (Sandbox Code Playgroud)
这段代码"起作用",因为它产生下面的输出,但我真的希望结果是一个向量,我有一种预感,其中一个应用函数将起作用.我只是坚持如何写它.非常感激任何的帮助.谢谢.
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))
}
Run Code Online (Sandbox Code Playgroud)
一种(效率低下)的方法是sapply在host向量上传递,guest作为参数传入(注意你可以简化它,sapply(host, match, guest)但这说明了接近这种事情的一般方法):
> sapply(host, matchIndices, guest)
A B C D
3 NA 2 1
Run Code Online (Sandbox Code Playgroud)
但是,这可以直接使用,match因为它接受向量第一个参数:
> match(host, guest)
[1] 3 NA 2 1
Run Code Online (Sandbox Code Playgroud)
如果要将命名向量作为输出,
> matched <- match(host, guest)
> names(matched) <- host
> matched
A B C D
3 NA 2 1
Run Code Online (Sandbox Code Playgroud)
可以包装成一个函数
matchIndices2 <- function(x, y) {
matched <- match(x, y)
names(matched) <- x
return(matched)
}
Run Code Online (Sandbox Code Playgroud)
回国
> matchIndices2(host, guest)
A B C D
3 NA 2 1
Run Code Online (Sandbox Code Playgroud)
如果你真的想把名字和比赛粘在一起成为一个字符串向量,那么:
> paste(match(host, guest), host, sep = ";")
[1] "3;A" "NA;B" "2;C" "1;D"
Run Code Online (Sandbox Code Playgroud)