如何将公式插入函数,以便它可用于计算连续行的值
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 中使用 ave
和 diff
。
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
我知道标题可能有点令人困惑,但请允许我澄清一下。 我有一列值
> 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 中使用 ave
和 diff
。
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