反面的

Nic*_*bbe 12 r which

我错过了一些明显的东西吗?看起来which基数R中缺少反函数(谷歌搜索,甚至搜索SO的"R反向",它返回无数不相关的链接)?

好吧,并不是说我不能写一个,而只是为了减轻我对它的失望和作为一个R-肌肉屈曲挑战的挫折:你将如何写一个?

我们需要的是一个像以下的功能:

invwhich<-function(indices, totlength)
Run Code Online (Sandbox Code Playgroud)

返回一个长度为逻辑的向量,totlength其中每个元素indices都是TRUE,其余元素是FALSE.

必然会有很多方法来实现这一点(其中一些方法确实很低调),因此争论为什么你的解决方案是"最好的".Oneliner有人吗?

如果它考虑到which(arr.ind??)的一些其他参数,那显然更好......

And*_*rie 11

单线解决方案:

invwhich <- function(indices, totlength) is.element(seq_len(totlength), indices)

invwhich(c(2,5), 10)
[1] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

  • 相当有效地证明单行并不总是"最佳"解决方案. (2认同)
  • is.element与%in%相同,因此替代项为seq_len(totlength)%in%索引。 (2认同)

Nic*_*bbe 5

我自己的解决方案(目前):根据@Marek的建议进行编辑.

invwhich<-function(indices, outlength, useNames = TRUE)
{
    rv<-logical(outlength)
    #rv<-rep(FALSE, outlength) #see Marek's comment
    if(length(indices) > 0)
    {
        rv[indices]<-TRUE
        if(useNames) names(rv)[indices]<-names(indices)
    }
    return(rv)
}
Run Code Online (Sandbox Code Playgroud)

它表现得非常好(显然比@ Andrie的oneliner更好),并且尽可能地使用useNames.但是有可能把它变成一个oneliner吗?

wrt性能,我只是使用:

someindices<-sample(1000000, 500000, replace=FALSE)
system.time(replicate(100, tmp<-invwhich(someindices, 1000000)))
Run Code Online (Sandbox Code Playgroud)

作为一种非常低保真的性能测量.