基于for循环向R向量添加值

问题描述:

我有一个数据框,其中包含运输系统上的wifi下载带宽和GPS数据(经度和纬度)。我想根据数据确定车辆向北行驶时的平均带宽,以及向南行驶时的平均带宽。基于for循环向R向量添加值

(来自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])} 
    } 

在这里,我基本上是说如果纬度值上升,那么车辆向北移动,因此输入从那个位置到移动矢量的带宽值。我期望只有带宽矢量的一部分值被添加到movenorth矢量,但所有2800值都被添加。我在这里做错了什么?

+0

您可能想要使用'for(y in seq_along(latitude))'或'for(y in 1:length(latitude))'。 – lmo

+0

这工作,非常感谢你。为什么我的原始方法不起作用? – Brad

+0

你不是说如果当前位置高于下一个位置,它就会向南行进? – sweetmusicality

利用R的矢量化操作。首先,我们使用diff找到latitude

latitude_change <- diff(df$latitude) 

连续元素之间的变化现在我们有它的长度大于latitude长度小于1的向量。方向发生在测量之间,所以这是有道理的。假设我们不会确定第一次测量的方向。这意味着如果latitude_change[i] > 0,那么火车的北行时间i - 1

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

我保持的df这部分是因为它的相关信息,因此一张桌子是为它的理想场所。

+0

因此,通过在数据框中添加一列,该命令只需输入大于0的所有纬度变化条目,然后用FALSE填充其余条目? – Brad

+0

结果是一样的,但不完全一样。阅读文档中的矢量算术:https://cran.r-project.org/doc/manuals/r-release/R-intro.html#Vector-arithmetic –

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

此外,您可能需要仔细检查latitude[y+1]是否正确。当前语法假定数据中纬度值的顺序从最新到最旧。根据您提供的信息无法知道这是否正确,但可能是相反的。如弗兰克指出的,你正在一个循环中增加你的向量,这是不好的做法(因为它不能很好地缩放,对于大对象变得很慢)。 Nathan Werth的答案提出了一个矢量化的实现。

+0

除了逻辑错误,OP也在循环中增加某些东西,在R中不好的做法;请参阅http://www.burns-stat.com/documents/books/the-r-inferno/的第2章。指向MCVE很好,但我不认为它属于答案。作为评论更好。既然你不能在OP下发表评论,我会在你自己的回答下把它作为评论。 – Frank

+1

我认为提交代码的渐进式改进对提交者@Frank很有用。话虽如此,我同意在一个循环中增加矢量是不好的做法(当处理大的矢量时变得非常清晰),更好的答案将包括改进的代码。自矢量化的替代品已发布后,我正在编辑我的答案,建议一个。我也正在将MCVE的建议发表评论。 – Luis

+1

包含足够的代码来重现问题会很有帮助。请参阅创建[最小,完整和可验证示例]的指导原则(https://*.com/help/mcve)。 – Luis