2017-06-07 22 views
0

我知道標題可能有點混淆,但請允許我澄清。 我有值如何將公式插入到函數中,以便可以用它計算連續行的值

> 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 

我希望有人能幫助我,非常感謝!

+0

你是對的。我輸了。刪除評論。 – G5W

+0

嗨@akrun我不確定滾動的區別是什麼。我只需要函數/公式爲每個連續行工作,並通過ID – avgjoe13

回答

0

您可以像這樣在基準R中使用avediff

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

在這裏,我們通過使用rev和在上的diff輸出使用rev所需順序返回向量饋送diff反向矢量中所需的順序計算。請注意,我們需要使用c(NA, ..)爲每個ID添加缺少的值。

返回

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") 
+0

索引它嗨@Imo感謝您的答案,但尚未完全工作,例如,該公式應該返回21和-62前兩個值。函數x應該從turn1中減去turn2。現在的數值仍然是一樣的.. – avgjoe13

+0

啊。我錯過了。添加了幾個'rev'來獲得所需的輸出。 – lmo

+0

再次感謝@Imo – avgjoe13

0

當你

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 
+0

謝謝@GGamba!我實際上編輯了你的代碼 df <- df %>%group_by(ID)%>% mutate(diff = angle(c(NA,diff(Direction)),0)) 這似乎工作! – avgjoe13

相關問題