gpt4 book ai didi

r - 如何修剪 R 向量?

转载 作者:行者123 更新时间:2023-12-04 11:29:21 25 4
gpt4 key购买 nike

我有以下排序向量:

> v
[1] -1 0 1 2 4 5 2 3 4 5 7 8 5 6 7 8 10 11

如何在不遍历整个向量的情况下删除 -1、0 和 11 条目,无论是使用用户循环还是隐式使用语言关键字?也就是说,我想在每条边上修剪向量,并且只在每条边上修剪向量,这样排序的序列在我的 min,max 参数 1 和 10 内。解决方案应该假设向量已排序以避免检查每个元素。

当我们想将向量中的项用作另一个对象中的索引时,这种解决方案可以在非常大的向量的向量化操作中派上用场。对于一个应用程序,请参阅 this thread .

最佳答案

要按索引在向量中包含元素:

v [2:10]

排除某些元素
v [-c (1, 11) ]

只包括某个范围:
v <- v [v>=1 & v <=10]

如果允许我假设,就像在您的示例中一样,要修剪的元素数量 << 向量中的元素数量,那么我想我可以击败二分查找:
> n<-1e8
> v<--3:(n+3)
>
> min <- 1
> max <- length(v)
>
> calcMin <- function(v, minVal){
+ while(v[min] < minVal){
+ min <- min + 1
+ }
+ min
+ }
>
> calcMax <- function(v, maxVal){
+ while(v[max] > maxVal){
+ max <- max - 1
+ }
+ max
+ }
>
> #Compute the min and max indices and create a sequence
> system.time(a <- v[calcMin(v, 1):calcMax(v,n)])
user system elapsed
1.030 0.269 1.298
>
> #do a binary search to find the elements (as suggested by @nograpes)
> system.time(b <- v[do.call(seq,as.list(findInterval(c(1,n),v)))])
user system elapsed
2.208 0.631 2.842
>
> #use negative indexing to remove elements
> system.time(c <- v[-c(1:(calcMin(v, 1)-1), (calcMax(v,n)+1):length(v))])
user system elapsed
1.449 0.256 1.704
>
> #use head and tail to trim the vector
> system.time(d <- tail(head(v, n=(calcMax(v,n)-length(v))), n=-calcMin(v, 1)+1))
user system elapsed
2.994 0.877 3.871
>
> identical(a, b)
[1] TRUE
> identical(a, c)
[1] TRUE
> identical(a, d)
[1] TRUE

关于r - 如何修剪 R 向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16220521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com