如何将公式插入函数,以便它可用于计算连续行的值

How to insert a formula into a function so that it can be used to calculate values for consecutive rows

我知道标题可能有点令人困惑,但请允许我澄清一下。 我有一列值

> df
    Direction
    139
    118
    180
    142
    185
    224
    137
    245

我有以下公式

((pt1 - pt2 + 180)%%360 - 180)

我想插入这个公式来计算每个连续实例之间的差异 示例:

((139 - 118 + 180)%%360 - 180) = 21
((118 - 180 + 180)%%360 - 180) = -62

我尝试过的一些事情

创建函数

angle <- function(turn1, turn2) {
  coursediff <- ((turn1 - turn2 + 180)
                 %%360 - 180)
  coursediff
}
angle(118, 180)
## [1] -62

尝试将它用于方向列的每个连续行,创建一个名为 Diff 的新列

df$Diff <- with(df, 
     ave(Direction, ID,  FUN=function(angle) c(NA, diff(angle))))

df %>% group_by(ID) %>% 
  mutate(gap=angle(c(NA,diff(Direction)), 1))

index <- function(angle) c(0, diff(angle))
DT <- data.table(df)
DT[, Diff := index(Direction), by = "ID"]

甚至

transform(df, 
          Diff=unlist(tapply(Direction, ID, 
                                function(angle) c(0, diff(Direction)))))

以上所有尝试都给了我相同的答案,就好像我只是简单地计算每行的差异,就像这样

df$Diff <- c(NA, diff(df$Direction))

这就是我现在得到的

> df
    Direction  Diff  ID
    139        NA    1
    118       -21    1
    180        62    1
    142       -38    1
    185        NA    2
    224        39    2
    137       -87    2
    245        108   2

希望有人能帮帮我,不胜感激!

您可以像这样在基数 R 中使用 avediff

dat$diff <- ave(dat$Direction, dat$ID,
                FUN=function(x) c(NA, (rev((diff(rev(x))) + 180) %% 360) -180))

这里,我们通过在输出上使用 rev 馈送 diff 反向向量和 return 以所需顺序馈送向量 rev 来计算所需的顺序diff 个。注意,我们需要使用c(NA, ..)为每个ID添加一个缺失值。

哪个return

dat
  Direction Diff ID diff
1       139   NA  1   NA
2       118  -21  1   21
3       180   62  1  -62
4       142  -38  1   38
5       185   NA  2   NA
6       224   39  2  -39
7       137  -87  2   87
8       245  108  2 -108

数据

dat <-
structure(list(Direction = c(139L, 118L, 180L, 142L, 185L, 224L, 
137L, 245L), Diff = c(NA, -21L, 62L, -38L, NA, 39L, -87L, 108L
), ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L)), .Names = c("Direction", 
"Diff", "ID"), row.names = c(NA, -8L), class = "data.frame")

当你

angle(118, 180)
## [1] -62

表示

angle(line1, line2)

您正在比较一个方向及其连续方向,例如下一个。

在你写的其他函数中,顺序是反的,即

angle(line2, line1)

只要解决这个问题,您就会得到想要的结果:

library(dplyr)

df %>% 
  group_by(ID) %>% 
  mutate(diff = (Direction - lead(Direction) + 180) %% 360 -180)
#> Source: local data frame [8 x 4]
#> Groups: ID [2]
#> 
#>   Direction  Diff    ID  diff
#>       <int> <int> <int> <dbl>
#> 1       139    NA     1    21
#> 2       118   -21     1   -62
#> 3       180    62     1    38
#> 4       142   -38     1    NA
#> 5       185    NA     2   -39
#> 6       224    39     2    87
#> 7       137   -87     2  -108
#> 8       245   108     2    NA