【问题标题】:Using for loop variable to access element in array yielding NA in R使用for循环变量访问数组中的元素在R中产生NA
【发布时间】:2019-02-21 21:49:21
【问题描述】:

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

有什么建议吗?

【问题讨论】:

  • 发布一个独立的、可重现的示例。
  • R 中: 存在一个具体问题,即1:0[1 0](不是空向量)。更普遍;尝试一个相当短的向量(如t)并使用cat(i,j,i+j,"\n") 打印索引,同时查看发生了什么

标签: r for-loop indexing


【解决方案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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-05
    • 2016-02-12
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多