使用for循环变量访问数组中的元素,在R

时间:2018-09-17 23:02:14

标签: r for-loop indexing

我正在使用嵌套的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,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值。 / p>

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我知道您想学习如何使用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.4461648.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))