所以我有10个递增的数字序列,每个看起来像(假设x(i) <- c(2, 3, 5, 6, 8, 10, 11, 17)表示i,范围从1到10 ),我有一个随机抽样数,比如p=9。现在,对于每个序列x(i),我需要找到一个数字,这个数字要比p小,并且要比p大,然后对于每个i(从1到10),我需要取这两个数字的差,并将它们存储在一个字符串中。
对于我这里给出的x(i),比p=9小的直接数是8,比p=9大的是10,它们的差值是(10-8)=2。
我试图获得一个代码,该代码将创建一个包含这些差异的字符串,其中字符串的第一个数字表示i=1的差异,第二个数字表示i=2的差异,依此类推。该字符串将包含i数字。我对R比较陌生,所以任何与循环相关的地方都会把我抛之脑后。任何帮助都将不胜感激。谢谢。
编辑:我把我正在处理的代码进行澄清。
fr = 100
dt = 1/1000 #dt in milisecond
duration = 2 #no of duration in s
nBins = 2000 #SpikeTrain
nTrials = 20 #NumberOfSimulations
MyPoissonSpikeTrain = function(p, fr= 100) {
p = runif(nBins)
q = ifelse(p < fr*dt, 1, 0)
return(q)
}
set.seed(1)
SpikeMat <- t(replicate(nTrials, MyPoissonSpikeTrain()))
Spike_times <- function(i) {
c(dt*which( SpikeMat[i, ]==1))}
set.seed(4)
RT <- runif(1, 0 , 2)
for (i in 1:nTrials){我的previous question中提到了对这段代码的解释。这里有20个(审判次数,又名nTrials)字符串,名为Spike_times(i)。每个Spike_times(i)都是在0到2秒之间的时间戳串,其中发生了尖峰,并且它们有不同数量的条目。现在我有一个RT形式的随机时间样本,它是0到2秒之间的随机数。假设RT是1.17秒,Spike_times(i)是0到2秒之间增加时间戳的顺序。
让我举个例子,Spike_times(3)看起来像0.003 0.015 0.017 ... 1.169 1.176 1.189 ... 1.985 1.990 1.997,然后我需要一个选择1.169和1.176的代码,并给出这些条目0.007的区别,并将其存储在另一个字符串中,比如W作为第三个条目c(_,_,0.007,.)并对所有20个字符串Spike_times(i)执行此操作,并为我提供包含20个条目的W。
我希望我的问题足够清楚。如果我需要纠正什么,请告诉我。
发布于 2018-04-17 08:34:55
通过对您的Spike_times函数做一个小小的更改,您可以通过sapply返回所有计算值的向量来实现这一点。
Spike_times <- function(i) {
x <- c(dt*which( SpikeMat[i, ]==1))
min(x[x > RT]) - max(x[x < RT])
}
set.seed(4)
RT <- runif(1, 0 , 2)
results <- sapply(1:20, Spike_times)发布于 2018-04-17 08:22:06
这种方法应该能做你想做的事。我正在创建一个函数,从单个序列中提取所需的结果,然后将其应用于每个序列。我在这里假设你的序列是行向量,并被堆叠在一个矩阵中。如果您的实际数据结构不同,则可以对代码进行调整,但您需要指出您的序列是如何实际存储的。
x <- matrix(rep(c(2,3,5,6,8,10,11,17), 10), nrow=10, byrow = T)
x
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#> [1,] 2 3 5 6 8 10 11 17
#> [2,] 2 3 5 6 8 10 11 17
#> [3,] 2 3 5 6 8 10 11 17
#> [4,] 2 3 5 6 8 10 11 17
#> [5,] 2 3 5 6 8 10 11 17
#> [6,] 2 3 5 6 8 10 11 17
#> [7,] 2 3 5 6 8 10 11 17
#> [8,] 2 3 5 6 8 10 11 17
#> [9,] 2 3 5 6 8 10 11 17
#> [10,] 2 3 5 6 8 10 11 17
set.seed(123)
p = sample(10, 1)
# write a function to do what you want on one sequence:
# NOTE: If p appears in the sequence I assume you want the
# closest numbers not equal to p! If you want the closest
# numbers to p including p itself change the less than/
# greater than to <= / >=
get_l_r_diff <- function(row, p) {
temp <- row - p
lower <- max(row[temp < 0])
upper <- min(row[temp > 0])
upper - lower
}
apply(x, 1, function(row)get_l_r_diff(row, p))
#> [1] 3 3 3 3 3 3 3 3 3 3
apply(x, 1, function(row) get_l_r_diff(row, 9))
#> [1] 2 2 2 2 2 2 2 2 2 2
# if the result really needs to be a string
paste(apply(x, 1, function(row) get_l_r_diff(row, 9)), collapse = "")
#> [1] "2222222222"对于您的情况,只需将这两个函数应用于索引:
spikes <- sapply(1:20, function(i){get_l_r_diff(Spike_times(i), RT)})https://stackoverflow.com/questions/49872702
复制相似问题