【问题标题】:operations to consecutive rows of a vector in R对R中向量的连续行的操作
【发布时间】:2016-07-10 07:22:10
【问题描述】:

我不知道如何更好地表达它。这是我的问题。

一个非常简单的数据框,比如 --

 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) 有没有更好的方法从连续点绘制线段?类似这样的指针也会非常有用。

【问题讨论】:

  • 不清楚你需要什么。也许如果你包括预期的输出......
  • 谢谢,我也添加了一个可能的输出。
  • 根据你的计算,with(df, sqrt((east-north)^2 + (lag(east)-lag(north))^2)),那么值会有所不同。

标签: r


【解决方案1】:
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 会向下看)。

我还在shift 调用中添加了fill = 0。这为无法执行 shift 函数的单元格指定一个值(在本例中为第 1 行)。通过将其设为零,您实际上将“起点”指定为 0,因此即使第一行也可以有一段距离,它只是从零点开始,而不是从零点上方的任何单元格开始。

【讨论】:

  • 我想,我可以对其他操作执行相同的操作。谢谢。
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2015-05-29
    • 1970-01-01
    • 2016-02-11
    • 2017-01-09
    • 1970-01-01
    相关资源
    最近更新 更多