【问题标题】:loop through and perform operations with values of a vector循环并使用向量的值执行操作
【发布时间】:2015-05-05 18:22:18
【问题描述】:

我有这个向量:

a = c(6722, 487,  5919, 179, 7305, 336, 10015, 615,  8651, 253, 679, 75,  8652, 118, 11436, 229)

我需要创建一个新向量,其值对的比率如下:

ratio = c(a[2]/a[1], a[4]/a[3], a[6]/a[5]... etc) 

所以输出应该是这样的:

ratio    num[1:8] 0.0724 0.03024 0.04599 etc   (edited)

我尝试了以下代码:

ratio = c()
  for (i in length(a)){
    ratio[i] = a[2*i]/a[2*i-1]
  }

得到了这个:

Error in a[0+2i] : invalid subscript type 'complex'

在我发现 R 认为我的意思是 i = sqrt(-1) 之后,我尝试了这个:

ratio = c()
 for (i in length(a)){
    ratio[i] = a[i+i]/a[i+i-1]
  }

生产的:

> ratio
 [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

然后我尝试使用 lapply:

lapply(a, function(x)
    a[x+i]/a[x+i-1])

这给了我一个 16 元素的列表,里面全是 NA。

有人知道怎么做吗?

【问题讨论】:

  • a[2i]/a[2i-1] - 你需要乘以2*i,而不是2i
  • 您的示例输出错误。 a[2]/a[1] 不是 7.25
  • @Frank - 是的,感谢您的提醒。复制百分比而不是比率。刚刚修好了。

标签: r loops for-loop


【解决方案1】:

这里不需要for 循环,只需尝试(不确定是否需要* 100L,因为您的描述与所需的输出不匹配)

a[c(FALSE, TRUE)]/ a[c(TRUE, FALSE)] * 100L
## [1]  7.244868  3.024159  4.599589  6.140789  2.924517 11.045655  1.363847  2.002448

【讨论】:

  • 做到了!谢谢大卫。如果你有时间/有兴趣,你介意解释一下这个解决方案是如何工作的吗?非常感谢!
  • 这是一种内置于 R 中的简单回收机制。如果较长的向量被较短的向量子集(例如,或 cbinded 到较短的向量),则较短的向量是被回收,所以你会得到FALSE, TRUE, FALSE, TRUE等,直到它达到更长向量的大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
相关资源
最近更新 更多