我不知道如何以更好的方式表达它。这是我的问题。
一个非常简单的数据框,如 -
df= {"time" "east" "north"
1 0 0
2 2 0
3 1 0
4 1 2
}
现在,我想在两个连续的时间帧(第一行除外)之间添加距离(作为另一列)。例如,在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
}
当然,我想有一种方法来获得从两个连续行向东和向北的距离并返回点之间的欧几里德距离。 1)如何在数据框中实现两个连续点之间的距离?
我想对巨大数据帧的子集应用类似的操作或可配置的函数(距离,连续减法等)。最后,我想绘制段,例如。
index = length(df$time)-1
segments( df$time[index],df$time[index+1], df$distance[index], df$distance[index+1] )
2)有没有更好的方法来绘制连续点的片段?这样的指针也非常有用。
答案 0 :(得分:4)
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 ) ]
应该达到你所追求的目标。 shift
函数采用给定行数偏移的值。 lag
表示它会向上看(lead
会向下看。)
我还在fill = 0
电话中添加了shift
。这指定了无法执行shift
功能的单元格的值(在本例中为第1行)。通过将其设为零,您可以有效地指定" start" 0的点,所以即使第一行可以有一个距离,它只是从零点开始,而不是它上面的任何单元格。
答案 1 :(得分:2)
我们可以使用dplyr
library(dplyr)
df %>%
mutate(distance = sqrt((east - lag(east, default = 0))^2 +
(north - lag(north, default = 0))^2))
# time east north distance
#1 1 0 0 0
#2 2 2 0 2
#3 3 1 0 1
#4 4 1 2 2