1
システム内のアイテムの移動を追跡するdata.table
があります。これらのデータは、ID
とLocation
の2つのフィールドに基づいてグループ化したいと思います。 Iが出力として持ちたい何連続したフィールド値に基づく索引付け
library(data.table)
example <- data.table(ID = rep(LETTERS[1:3], each = 6),
Location = c(1,2,3,1,2,1,2,2,2,3,3,1,2,3,3,3,1,3))
example
# ID Location
# 1: A 1
# 2: A 2
# 3: A 3
# 4: A 1
# 5: A 2
# 6: A 1
# 7: B 2
# 8: B 2
# 9: B 2
# 10: B 3
# 11: B 3
# 12: B 1
# 13: C 2
# 14: C 3
# 15: C 3
# 16: C 3
# 17: C 1
# 18: C 3
にかかわらず、新しい位置が何であるかの、たび位置変化を増分番号と新しい列(すなわち、その場所は歴史の他の場所に存在する場合)。むしろグループ内でのみインクリメントするthis questionの反対です。
expected_output <- data.table(ID = rep(LETTERS[1:3], each = 6),
Location = c(1,2,3,1,2,1,2,2,2,3,3,1,2,3,3,3,1,3),
Group = c(1,2,3,4,5,6,1,1,1,2,2,3,1,2,2,2,3,4))
expected_output
# ID Location Group
# 1: A 1 1
# 2: A 2 2
# 3: A 3 3
# 4: A 1 4
# 5: A 2 5
# 6: A 1 6
# 7: B 2 1
# 8: B 2 1
# 9: B 2 1
# 10: B 3 2
# 11: B 3 2
# 12: B 1 3
# 13: C 2 1
# 14: C 3 2
# 15: C 3 2
# 16: C 3 2
# 17: C 1 3
# 18: C 3 4
私はこれまで少しの運とby
引数の数の異なる組み合わせを試してみました。私が得ることができると思われる最も近いものは、変更が発生したときに部分的に正しく表示されますが、内部的にインクリメントするdiff
のものです。
output <- example
output[, Group := 1:.N, by = paste0(ID, Location, diff(Location))]
output
# ID Location Group
# 1: A 1 1
# 2: A 2 1 # not incrementing/new group
# 3: A 3 1 # not incrementing/new group
# 4: A 1 2
# 5: A 2 1
# 6: A 1 3
# 7: B 2 1
# 8: B 2 2 # incrementing when shouldn't
# 9: B 2 1
# 10: B 3 1
# 11: B 3 1
# 12: B 1 1
# 13: C 2 1
# 14: C 3 1
# 15: C 3 2
# 16: C 3 1
# 17: C 1 1
# 18: C 3 1
この時点で、私はかなり失われていますが、解決策が私を顔で見つめていると確信しています。
完璧に動作しているようですが、あなたに感謝を!私はこれまで「激流」について知らなかった。 SOが私に許したらすぐに受け入れます。 – Gaffi