我不知道如何用更好的方式表达它。这是我的问题。
一个非常简单的数据框,比如——
df= {"time" "east" "north"
1 0 0
2 2 0
3 1 0
4 1 2
}
Run Code Online (Sandbox Code Playgroud)
现在,我想添加两个连续时间范围(第一行除外)之间的距离(作为另一列)。例如,time==2
距离应计算为sqrt( (2-0)*(2-0) + (0-0)*(0-0) )
。可能的结果可能是这样的
df= {"time" "east" "north" "distance"
1 0 0 0
2 2 0 2
3 1 0 1
4 1 2 2
}
Run Code Online (Sandbox Code Playgroud)
当然,我想要一种方法来获取从连续两行向东和向北的距离,并返回点之间的欧几里德距离。 1)如何获得数据框中两个连续点之间的距离?
我想对巨大数据帧的子集应用类似的操作或可配置函数(距离、连续减法等)。最后我想绘制一些片段,例如
index = length(df$time)-1
segments( df$time[index],df$time[index+1], df$distance[index], df$distance[index+1] )
Run Code Online (Sandbox Code Playgroud)
2)是否有更好的方法来绘制连续点的线段?类似这样的指针也将非常有用。
library( data.table )
setDT( df )[ , distance := sqrt( ( east - shift( east, 1, type = "lag", fill = 0 ) ) ^ 2 +
( north - shift( north, 1, type = "lag", fill = 0 ) ) ^ 2 ) ]
Run Code Online (Sandbox Code Playgroud)
应该能达到你所追求的目标。该shift
函数采用按给定行数偏移的值。lag
意味着它会向上看(lead
会向下看)。
我也加入fill = 0
了通话shift
。shift
这指定了无法执行该函数的单元格的值(在本例中为第 1 行)。通过将该值设置为零,您实际上指定了 0 的“起始”点,因此即使第一行可以有一定距离,它也只是距零点,而不是其上方的任何单元格。