我错过了一些明显的东西吗?看起来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)
我自己的解决方案(目前):根据@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)
作为一种非常低保真的性能测量.
| 归档时间: |
|
| 查看次数: |
2636 次 |
| 最近记录: |