如何在 R 中的列表的每个向量(不同长度)中附加第一个和最后一个元素,而不会使代码变慢?
How to append first and last element in each vector (of a different length) of a list in R, without making the code slow?
我是 R 和 Whosebug 的新手。因此,如果我遗漏了什么,请告诉我。我正在研究模拟非均质过程以更好地理解神经行为。我的代码以我的方式工作,比如 20
次试验,每次持续 2
秒(每次试验代表一个尖峰列车)。然后列表 SpikeTimes
给了我一个 20
向量的列表,其中每个向量对应于特定试验中尖峰发生位置的时间戳。 [例如,SpikeTimes[1]
看起来像这样,0.002250802 0.053934034...1.971574170 2.023090384
表示在第一个 Spike Train 中,尖峰出现在 0.002250802
、0.053934034
等等。我不知道为什么它还会显示超出我的 2
秒时间限制的时间戳,但我稍后会处理]。我的代码看起来像这样--
nTrials=20
t_max=2.0000000
LambdaInv<- function(x){ifelse( x< 15, x/30,
ifelse(x >= 15 & x < 38, ((x-15)/46)+0.5,
ifelse(x >= 38 & x <53, ((x-38)/30)+1.0,
ifelse(x >= 53 & x< 67.4, ((x-53)/72)+1.5,
((x-67.4)/30)+1.7))))}
t = 0
s = 0
X = numeric(0)
NonHomoSpikes <- function(t_max){
while(t <= t_max){
u <- runif(1)
s <- s-log(u)
t <- LambdaInv(s)
X <- c(X,t)
}
return(X)
}
SpikeTimes <- lapply(1:nTrials, function(x) NonHomoSpikes(2))
我的问题是,对于列表中的每个向量 SpikeTimes
;它给出了尖峰的时间戳,我还想包括尖峰列车的开始(即 0
)和结束(即 2
)。所以我想附加这个列表,让每个向量包含第一个条目 0
和最后一个条目 2
.
我的 SpikeTimes[1]
看起来像 0 0.002250802 0.053934034...1.971574170 2
,其他 SpikeTimes[i]
看起来也很相似。我尝试 SpikeTimes <- c(0, SpikeTimes)
在开始时输入 0
但它只使列表有 21 个向量而不是 20 个向量 0
作为第一个元素(我的意思是我明白为什么会这样) .我怎样才能以不会使我的代码变慢的方式来做到这一点?我是 R 的新手,在互联网上阅读对解决这个特殊问题没有帮助。我将不胜感激任何类型的输入。
解决方法:将NonHomoSpikes
return
语句改为return(c(0, X, 2))
.
到'manually'停止if t < 2
(如评论所述):
NonHomoSpikes <- function(t_max){
while(t <= t_max){
u <- runif(1)
s <- s-log(u)
t <- LambdaInv(s)
if(t > 2) break
X <- c(X,t)
}
return(c(0,X,0))
}
我是 R 和 Whosebug 的新手。因此,如果我遗漏了什么,请告诉我。我正在研究模拟非均质过程以更好地理解神经行为。我的代码以我的方式工作,比如 20
次试验,每次持续 2
秒(每次试验代表一个尖峰列车)。然后列表 SpikeTimes
给了我一个 20
向量的列表,其中每个向量对应于特定试验中尖峰发生位置的时间戳。 [例如,SpikeTimes[1]
看起来像这样,0.002250802 0.053934034...1.971574170 2.023090384
表示在第一个 Spike Train 中,尖峰出现在 0.002250802
、0.053934034
等等。我不知道为什么它还会显示超出我的 2
秒时间限制的时间戳,但我稍后会处理]。我的代码看起来像这样--
nTrials=20
t_max=2.0000000
LambdaInv<- function(x){ifelse( x< 15, x/30,
ifelse(x >= 15 & x < 38, ((x-15)/46)+0.5,
ifelse(x >= 38 & x <53, ((x-38)/30)+1.0,
ifelse(x >= 53 & x< 67.4, ((x-53)/72)+1.5,
((x-67.4)/30)+1.7))))}
t = 0
s = 0
X = numeric(0)
NonHomoSpikes <- function(t_max){
while(t <= t_max){
u <- runif(1)
s <- s-log(u)
t <- LambdaInv(s)
X <- c(X,t)
}
return(X)
}
SpikeTimes <- lapply(1:nTrials, function(x) NonHomoSpikes(2))
我的问题是,对于列表中的每个向量 SpikeTimes
;它给出了尖峰的时间戳,我还想包括尖峰列车的开始(即 0
)和结束(即 2
)。所以我想附加这个列表,让每个向量包含第一个条目 0
和最后一个条目 2
.
我的 SpikeTimes[1]
看起来像 0 0.002250802 0.053934034...1.971574170 2
,其他 SpikeTimes[i]
看起来也很相似。我尝试 SpikeTimes <- c(0, SpikeTimes)
在开始时输入 0
但它只使列表有 21 个向量而不是 20 个向量 0
作为第一个元素(我的意思是我明白为什么会这样) .我怎样才能以不会使我的代码变慢的方式来做到这一点?我是 R 的新手,在互联网上阅读对解决这个特殊问题没有帮助。我将不胜感激任何类型的输入。
解决方法:将NonHomoSpikes
return
语句改为return(c(0, X, 2))
.
到'manually'停止if t < 2
(如评论所述):
NonHomoSpikes <- function(t_max){
while(t <= t_max){
u <- runif(1)
s <- s-log(u)
t <- LambdaInv(s)
if(t > 2) break
X <- c(X,t)
}
return(c(0,X,0))
}