Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 找到子向量不可用的索引(没有重复项)_R_Performance_Duplicates_Unique_Rcpp - Fatal编程技术网

R 找到子向量不可用的索引(没有重复项)

R 找到子向量不可用的索引(没有重复项),r,performance,duplicates,unique,rcpp,R,Performance,Duplicates,Unique,Rcpp,给定的是一个向量 xuniqueTill和uniquetil2不会输出相同的结果。啊,对了。Which.min始终给出一个结果,其中“Which”返回空向量(导致我必须填充NAs)。非常感谢。与which.min(!duplicated)不同的是which.max(duplicated)保存向量求反操作。 uniqueTill <- function(x) { res <- unlist(lapply(1:length(x), function(i) which(duplicat

给定的是一个向量


x
uniqueTill
uniquetil2
不会输出相同的结果。啊,对了。Which.min始终给出一个结果,其中“Which”返回空向量(导致我必须填充NAs)。非常感谢。与
which.min(!duplicated)
不同的是
which.max(duplicated)
保存向量求反操作。
uniqueTill <- function(x) {
  res <- unlist(lapply(1:length(x), function(i) which(duplicated(x[i:length(x)]))[1]+i-2))
  res[is.na(res)] <- length(x)
  res
}
inds <- uniqueTill(x)
#check if the vectors are in fact unqiue
lapply(1:length(inds), function(k) x[k:inds[k]])
lapply(1:length(inds), function(k) any(duplicated(x[k:inds[k]])))

#check if the next element in the original vector makes the subvectors no more unique
lapply(1:length(inds), function(k) x[k:(inds[k]+1)])
lapply(1:length(inds), function(k) any(duplicated(x[k:(inds[k]+1)]))) #here the last 3 are FALSE since there are no more duplicates, but thats wanted
uniqueTill2 <- function(x) {
  res <- unlist(lapply(1:length(x), function(i) which.min(!duplicated(x[i:length(x)]))+i-2))
  res[is.na(res)] <- length(x)
  res
}

#newer version
uniqueTill2 <- function(x) {
  unlist(lapply(1:length(x), function(i) {
    dups <- duplicated(x[i:length(x)])
    if(!any(dups)) return(length(x))
    which.max(dups)+i-2
  }))
}
x <- c("A","B","C","A","C","B","C","A")
microbenchmark::microbenchmark(uniqueTill(x),uniqueTill2(x))
Unit: microseconds
           expr    min      lq     mean  median      uq     max neval
  uniqueTill(x) 63.002 66.5010 74.50998 68.4015 73.3005 200.300   100
 uniqueTill2(x) 56.401 58.8505 63.29607 60.8505 63.4510 119.901   100

xx <- rep(x,1e3)
microbenchmark::microbenchmark(uniqueTill(xx),uniqueTill2(xx),times=10)
Unit: milliseconds
            expr      min       lq     mean   median       uq      max neval
  uniqueTill(xx) 752.8640 761.6679 822.4813 845.1330 850.2489 906.9668    10
 uniqueTill2(xx) 719.3167 725.2254 744.7558 727.9224 747.4992 812.6559    10