我的数据框包含运输系统上的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])}
}
在这里,我基本上说如果纬度值上升,那么车辆向北移动,因此从该位置输入带宽值到movenorth矢量。我希望只有一部分来自带宽矢量的值被添加到movingnorth矢量,但是所有2800个值都被添加。我在这里做错了什么?
答案 0 :(得分:1)
利用R的矢量化操作。首先,我们使用diff
来查找latitude
latitude_change <- diff(df$latitude)
现在我们有一个长度比latitude
长度小1的向量。方向发生在测量之间,因此这是有道理的。假设我们不会确定第一次测量的方向。这意味着如果latitude_change[i] > 0
,那么火车的北行时间为i - 1
。
df$movingnorth <- c(FALSE, latitude_change > 0)
我保留df
的这一部分因为它是相关的信息,所以桌子是它的最佳位置。
答案 1 :(得分:0)
正如lmo所说,你想使用seq_along(latitude)
或1:length(latitude)
,它会返回索引而不是latitude
中的实际元素。
此外,您可能需要仔细检查latitude[y+1]
是否正确。当前语法假定数据中纬度值的顺序从最新到最旧。从您提供的信息中无法确定这是否正确,但可能相反。
正如弗兰克所指出的那样,你在循环中增长你的向量,这是不好的做法(因为它不能很好地扩展并且对于大型对象变得非常慢)。 Nathan Werth的回答提出了一个矢量化实现。