R Индексация с переменными - PullRequest
0 голосов
/ 04 марта 2020

У меня есть простой вопрос о том, как R обрабатывает индексирование. У меня есть проблема в том, что если у меня есть вектор a , например, вектор строки, содержащий 100 чисел, и я хочу получить доступ к 7-му значению в этом векторе, простой способ сделать это быть просто написать [7], и я бы получил свою ценность. Тем не менее, если я хочу вместо этого использовать переменную (например, установить b <- 7 и затем написать a [b]), то иногда это даст мне [7], но в других случаях это даст мне значение в [[ 6]. См. Пример ниже: </p>

a <- c(1:100)
b <- 7

a[7]
7

a[b]
6

Если этой информации недостаточно, я буду рад опубликовать мой фактический код и контекст, в котором я сталкиваюсь с этой проблемой. Спасибо!

** РЕДАКТИРОВАТЬ **

Вот еще немного информации и фактический код, который заставляет меня чесать голову над этой проблемой.

Seed <- 1

SimTime <- 65 #Simulation time in seconds
TimeStep <- .1 #Time between sim outputs

set.seed(Seed)

TotalSteps <- SimTime/TimeStep

TransitionProbabilities <- matrix(rbind(c(0.18766224,2.168453e-19,1.023408e-06,1.953125e-02,0.7928055,6.939317e-18,7.275958e-12),c(0.28125801,7.818222e-03,1.274877e-01,3.671646e-04,5.791627e-01,3.906250e-03,4.579670e-16),c(0.61551744,0.1333229e-01,0,9.765625e-04,6.103516e-05,2.501221e-01,3.231174e-27),c(0.06738377,2.563524e-02,0.000000e+00,1.734723e-18,2.501335e-01,6.255039e-01,3.134356e-02),c(0.55078275,1.253358e-01,1.220703e-04,9.818187e-91,7.105427e-15,3.237305e-01,2.884867e-05),c(0.32425383,8.288771e-08,5.690945e-14,1.220708e-04,1.562500e-02,1.253128e-01,5.346862e-01),c(0.32425383,8.288771e-08,5.690945e-14,1.220708e-04,1.562500e-02,1.253128e-01,5.346862e-01)),nrow = 7,ncol=7)
SlopeMeanVar <- matrix(rbind(c(5.9572805,0.8660917),c(7.9495652,5.5765029),c(2.7789705,1.1488065),c(-0.1938019,1.8259470),c(-13.3744125,83.1549576),c(-127.0796007,8048.6051287),c(-69.1002577,118.1835389)),nrow = 7,ncol=2)
TimeMeanVar <- matrix(rbind(c(36.444228,326.1963044),c(10.170391,19.0602454),c(9.890028,15.4900072),c(2.269258,3.9720946),c(1.647609,1.1667697),c(1.033581,0.4013006),c(6.512817,24.2769279)),nrow = 7,ncol=2)

TotalTime <- 0
LoopCount <- 0
LastHeight <- 0

TrueVertexList <- c()
SlopeList <- c()
TimeList <- c()
PhaseList <- c()

TrendLength <- rep(0,TotalSteps*2)
TimeColumn <- seq(0,SimTime*2-TimeStep,.1)

StartIndicies <- c()
EndIndicies <- c()

while(TotalTime < SimTime){
  LoopCount <- LoopCount + 1
  if(LoopCount == 1){
    #Choose first phase
    Phase <- sample(c(1:7),1)
    StartTime <- 0.1
    StartIndex <- 2
  }else{
    #Choose next phase using transition probabilities based on LastPhase
    Phase <- sample(c(1:7),1,prob = TransitionProbabilities[LastPhase,])
    StartTime <- TotalTime + TimeStep
    StartIndex <- StartTime*10+1
  }

  slope <- rnorm(1, mean = SlopeMeanVar[Phase,1], sd = sqrt(SlopeMeanVar[Phase,2]))
  time <- round(rnorm(1, mean = TimeMeanVar[Phase,1], sd = sqrt(TimeMeanVar[Phase,2])),digits = 1)

  EndTime <- StartTime + time - TimeStep
  EndIndex <- (EndTime) * 10 + 1

  TempTimeColumn <- seq(TimeStep,time,TimeStep)

  TrendLength[StartIndex:EndIndex] <- TempTimeColumn*slope + LastHeight

  TotalTime <- TotalTime + time
  LastHeight <- TrendLength[EndIndex]
  LastPhase <- Phase

  SlopeList <- c(SlopeList,slope)
  TrueVertexList <- c(TrueVertexList,TotalTime*10+1)
  TimeList <- c(TimeList, time)
  PhaseList <- c(PhaseList, Phase)

  StartIndicies <- c(StartIndicies, StartIndex)
  EndIndicies <- c(EndIndicies, EndIndex)
  plot(TimeColumn[1:TotalTime*10+1],TrendLength[1:TotalTime*10+1],type='l')
}

> StartIndex
[1] 650
> TrendLength[StartIndex]
[1] 341.1459
> TrendLength[650]
[1] 337.7889
> TrendLength[649]
[1] 341.1459

Спасибо всем за любое руководство.

1 Ответ

0 голосов
/ 04 марта 2020

Итак, проблема в том, что

StartIndex == 650
# [1] FALSE

Ваша переменная StartIndex на самом деле не равна 650. Это даже более ясно, если вы сделаете

print(StartIndex, digits=20)
# [1] 649.99999999999989

Вы должны быть особенно осторожны, когда использование чисел с плавающей точкой для извлечения значений из массивов. Вы хотите либо round(), либо truncated() самостоятельно, чтобы вы знали, что именно происходит. Убедитесь, что ваш индекс всегда целое число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...