2017-06-07 3 views
0

タイトルが少し混乱するかもしれないがわかりましたが、わかりやすくしてください。 私は各連続インスタンス間 例差を計算するために、この数式を挿入したい私は、次の式連続した行の値を計算するために関数に式を挿入する方法

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

を有する値

> df 
    Direction 
    139 
    118 
    180 
    142 
    185 
    224 
    137 
    245 

でカラムを有する:

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

私が試したことのいくつか

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"] 
デフという名前の新しい列を作成し、列方向のための連続した各列のためにそれを使用しようとする機能

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

を作成します

あるいは

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

:あなたが書いた他の関数で

は、順序が逆になり、それが

angle(line2, line1) 

ただ、これを修正し、あなたが望む結果を得ることです。私はそれを失った。コメントを削除する。 – 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逆ベクトルを供給することによって、所望の順序で計算しdiffの出力にrevを使用して所望の順序でベクトルを返します。各IDに欠損値を追加するには、c(NA, ..)を使用する必要があります。

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

こんにちは@私はあなたの答えをありがとう、かなりうまくいっていない、例えば、数式は21と-62を返します最初の2つの値。関数xは、turn1からturn2を減算するものとする。今の値はまだ同じです.. – avgjoe13

+0

ああ。私は逃しました。希望の出力を得るために 'rev'を2つ追加しました。 – lmo

+0

もう一度@Imo – avgjoe13

0

あなたが行うと

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

手段

angle(line1, line2) 

あなたはその方向をその連続したものと比較しています。次のもの。あなたは正しいです

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))) これは動作するようです。 – avgjoe13

関連する問題