首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从一个数列中,我如何在R中找到一个比一个特定随机数更小(和更大)的直接数?

从一个数列中,我如何在R中找到一个比一个特定随机数更小(和更大)的直接数?
EN

Stack Overflow用户
提问于 2018-04-17 07:56:57
回答 2查看 177关注 0票数 0

所以我有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比较陌生,所以任何与循环相关的地方都会把我抛之脑后。任何帮助都将不胜感激。谢谢。

编辑:我把我正在处理的代码进行澄清。

代码语言:javascript
复制
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

我希望我的问题足够清楚。如果我需要纠正什么,请告诉我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-17 08:34:55

通过对您的Spike_times函数做一个小小的更改,您可以通过sapply返回所有计算值的向量来实现这一点。

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2018-04-17 08:22:06

这种方法应该能做你想做的事。我正在创建一个函数,从单个序列中提取所需的结果,然后将其应用于每个序列。我在这里假设你的序列是行向量,并被堆叠在一个矩阵中。如果您的实际数据结构不同,则可以对代码进行调整,但您需要指出您的序列是如何实际存储的。

代码语言:javascript
复制
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"

对于您的情况,只需将这两个函数应用于索引:

代码语言:javascript
复制
spikes <- sapply(1:20, function(i){get_l_r_diff(Spike_times(i), RT)})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49872702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档