我正在使用嵌套的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>
有什么建议吗?
答案 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.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))