Использование переменной цикла для доступа к элементу в массиве, в результате чего NA в R - PullRequest
0 голосов
/ 18 сентября 2018

Я использую вложенный цикл for для создания жадного алгоритма в R.

z = 0
for (j in 1:length(t))
  for (i in 1:(length(t) - j))
    if ((t[j + i] - t[j]) >= 30)
      {z <- c(z,j + i - 1)
      j <- j + i - 1
      break}
z

Где t - такой вектор, как:

 [1]  12.01485  26.94091  33.32458  49.46742  65.07425  76.05700
 [7]  87.11043 100.64116 111.72977 125.72649 139.46460 153.67292
[13] 171.46393 184.54244 201.20850 214.05093 224.16196 237.12485
[19] 251.51753 258.45865 273.95466 285.42704 299.01869 312.35587
[25] 326.26289 339.78724 353.81854 363.15847 378.89307 390.66134
[31] 402.22007 412.86049 424.23181 438.50462 448.88005 462.59917
[37] 473.65289 487.20678 499.80053 509.14141 526.03873 540.17209
[43] 550.69941 565.74602 576.06882 589.07297 598.53208 614.20677
[49] 627.44605 648.08346 665.49614 681.46445 691.01806 704.05762
[55] 714.09172 732.04124 745.90960 758.52628 769.80519 779.41537
[61] 788.35732 805.78547 818.75262 832.71196 844.97859 856.08608
[67] 865.72998 875.55945 887.20862 900.00000

Цель для функциичтобы найти индексы, чьи различия максимально приближены к 30, и сохранить их в z.

Например, с предоставленным вектором t я ожидал бы, что z будет [0, 2, 4, 6,8, 10, ... 70]

Функциональность не моя проблема сейчас, так как я сталкиваюсь с ошибкой:

Error in if ((t[j + i] - t[j]) >= 30) { : 
  missing value where TRUE/FALSE needed

Я новичок в R, так что я знаюЯ не использую векторизацию, которой известен R.Я просто хочу, чтобы «j» и «i» были «переменными счетчика», которые я могу использовать для доступа к определенным элементам вектора t, но по неизвестной мне причине оператор if не дает значения T / F.

Есть предложения?

1 Ответ

0 голосов
/ 18 сентября 2018

Я знаю, что вы хотите узнать, как использовать for-loop, но вам трудно помочь, потому что вы не предоставили воспроизводимый пример.С другой стороны, в R многие функции были векторизованы, что означает, что вы можете избежать for-loop для достижения той же задачи с более эффективными способами.

На основе описания в вашем посте "Цель дляФункция состоит в том, чтобы найти индексы, чьи различия максимально приближены к 30, и сохранить их в z ».Я предоставил следующий пример для ответа на ваш вопрос без for-loop.

z <- which.min(abs(diff(vec) - 30))
z
# [1] 49

vec[c(z, z + 1)]
# [1] 627.4461 648.0835 

. На основании предоставленных вами данных индексы с разницей чисел, которые ближе всего к 30, равны 49.Числа 627.4461 и 648.0835.

Данные

vec <- c("12.01485 26.94091 33.32458 49.46742 65.07425 76.05700 87.11043 
         100.64116 111.72977 125.72649 139.46460 153.67292 171.46393 
         184.54244 201.20850 214.05093 224.16196 237.12485 251.51753 
         258.45865 273.95466 285.42704 299.01869 312.35587 326.26289 
         339.78724 353.81854 363.15847 378.89307 390.66134 402.22007 
         412.86049 424.23181 438.50462 448.88005 462.59917 473.65289 
         487.20678 499.80053 509.14141 526.03873 540.17209 550.69941 
         565.74602 576.06882 589.07297 598.53208 614.20677 627.44605 
         648.08346 665.49614 681.46445 691.01806 704.05762 714.09172 
         732.04124 745.90960 758.52628 769.80519 779.41537 788.35732 
         805.78547 818.75262 832.71196 844.97859 856.08608 865.72998 
         875.55945 887.20862 900.00000")

vec <- strsplit(vec, split = " ")[[1]]

vec <- as.numeric(grep("[0-9]+\\.[0-9]+", vec, value = TRUE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...