[英]operations to consecutive rows of a vector in R
我不知道如何用更好的方式表达它。 这是我的问题。
一个非常简单的数据框,例如-
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)是否有更好的方法来绘制连续点的线段? 诸如此类的指针也将非常有用。
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行)。 通过将其设置为零,可以有效地将“起始”点指定为0,因此即使第一行也可以有一个距离,也就是从零点开始的距离,而不是其上方的任何单元格。
我们可以使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.