gpt4 book ai didi

r - 比较同一向量的相邻元素(避免循环)

转载 作者:行者123 更新时间:2023-12-04 09:33:36 26 4
gpt4 key购买 nike

我设法写了一个for loop来比较以下向量中的字母:

bases <- c("G","C","A","T")
test <- sample(bases, replace=T, 20)
test将返回
[1] "T" "G" "T" "G" "C" "A" "A" "G" "A" "C" "A" "T" "T" "T" "T" "C" "A" "G" "G" "C"

使用 Comp()函数,我可以检查一个字母是否与下一个字母匹配
Comp <- function(data)
{
output <- vector()
for(i in 1:(length(data)-1))
{
if(data[i]==data[i+1])
{
output[i] <-1
}
else
{
output[i] <-0
}
}
return(output)
}

导致;
> Comp(test)
[1] 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0

这是可行的,但是大量运行非常缓慢。因此我尝试了 sapply()
Comp <- function(x,i) if(x[i]==x[i+1]) 1 else 0
unlist(lapply(test, Comp, test))

不幸的是,它不起作用...( Error in i + 1 : non-numeric argument to binary operator)我很难弄清楚如何访问向量中的前一个字母进行比较。同样,“不比较”最后一个字母的 length(data)-1可能会成为问题。

谢谢大家的帮助!

干杯
幸运的

最佳答案

只是“滞后” test并使用被矢量化的==

bases <- c("G","C","A","T")
set.seed(21)
test <- sample(bases, replace=TRUE, 20)
lag.test <- c(tail(test,-1),NA)
#lag.test <- c(NA,head(test,-1))
test == lag.test

更新:

另外,您的 Comp函数很慢,因为在初始化时未指定 output的长度。我怀疑您正在尝试预分配,但是 vector()创建了一个零长度的向量,该向量必须在循环的每次迭代期间都进行扩展。如果将对 Comp的调用更改为 vector(),则 vector(length=NROW(data)-1)函数的速度将大大提高。
set.seed(21)
test <- sample(bases, replace=T, 1e5)
system.time(orig <- Comp(test))
# user system elapsed
# 34.760 0.010 34.884
system.time(prealloc <- Comp.prealloc(test))
# user system elapsed
# 1.18 0.00 1.19
identical(orig, prealloc)
# [1] TRUE

关于r - 比较同一向量的相邻元素(避免循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6955357/

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