【问题标题】:Adding values to an R vector based on a for loop基于 for 循环向 R 向量添加值
【发布时间】:2017-08-15 18:47:03
【问题描述】:

我有一个数据框,其中包含交通系统上的 wifi 下载带宽和 GPS 数据(纬度和经度)。我想从数据中确定车辆向北移动时的平均带宽是多少,向南移动时的平均带宽是多少。

(来自 df 的带宽和纬度值)

bandwidth <- df$bandwidth

latitude <-df$latitude

(这两个都有 2800 个条目)

(根据车辆是向北还是向南移动,创建空向量以填充带宽值)

movingnorth <- vector('numeric')

movingsouth <- vector('numeric')

(如果火车向北移动,则用带宽向量中的数据填充移动的北向量)

for(y in latitude){

  if(latitude[y]>= latitude[y+1]){
  movingnorth <- c(movingnorth, received[y])}
  }

在这里,我基本上是说如果纬度值上升,那么车辆正在向北移动,因此将该位置的带宽值输入到movingnorth向量中。我希望仅将带宽向量中的一部分值添加到移动北向量中,但会添加所有 2800 个值。我在这里做错了什么?

【问题讨论】:

  • 您可能想使用for(y in seq_along(latitude))for(y in 1:length(latitude))
  • 成功了,非常感谢。为什么我原来的方法不起作用?
  • 如果当前位置高于下一个位置,您不是说它会向南吗?
  • 另外,纬度是一个向量,您没有具体说明您想用它测量什么,所以这就是为什么使用1:length(latitude) 是有意义的
  • @sweetmusicality 是的,你是对的

标签: r for-loop vector


【解决方案1】:

利用 R 的矢量化操作。首先我们使用diff来查找latitude的连续元素之间的变化

latitude_change <- diff(df$latitude)

现在我们有一个长度比latitude 的长度小1 的向量。方向发生在测量之间,所以这是有道理的。假设我们不会确定第一次测量的方向。所以这意味着如果latitude_change[i] &gt; 0,那么火车的北行时间是i - 1

df$movingnorth <- c(FALSE, latitude_change > 0)

我保留df 的这一部分,因为它是相关信息,所以桌子是放置它的最佳位置。

【讨论】:

  • 所以通过在数据框中添加一列,这个命令就是简单的输入所有大于0的纬度变化条目,然后用FALSE填充剩余的条目?
  • 结果是一样的,但不完全一样。阅读文档中的向量算术:cran.r-project.org/doc/manuals/r-release/…
【解决方案2】:

正如 lmo 所说,您想使用 seq_along(latitude)1:length(latitude),它们返回索引而不是 latitude 中的实际元素。

另外,您可能需要仔细检查latitude[y+1] 是否正确。当前语法假定数据中纬度值的顺序是从最新到最旧。从您提供的信息中无法知道这是否正确,但可能正好相反。

正如 Frank 所指出的,您正在循环增长您的向量,这是一种不好的做法(因为它不能很好地扩展并且对于大型对象变得非常慢)。 Nathan Werth 的回答建议使用矢量化实现。

【讨论】:

  • 除了逻辑错误之外,OP 还在循环中增长一些东西,这是 R 中的坏习惯;请参阅burns-stat.com/documents/books/the-r-inferno 的第 2 章。指向 MCVE 很好,但我认为它不属于答案。作为评论更好。由于您不能在 OP 下发表评论,我会说将其作为评论放在您自己的答案下。
  • 我认为对建议代码的增量改进对提交者@Frank 很有用。话虽如此,我同意在循环中增长向量是不好的做法(在使用大向量时会变得非常清楚),更好的答案将包括改进的代码。由于已经发布了矢量化替代方案,因此我正在编辑我的答案以建议该替代方案。我还将 MCVE 建议移至评论。
  • 包含足够的代码来重现问题会很有帮助。请参阅创建Minimal, Complete, and Verifiable example 的指南。
猜你喜欢
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多