2017-11-07 3 views
1

システム内のアイテムの移動を追跡するdata.tableがあります。これらのデータは、IDLocationの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 

この時点で、私はかなり失われていますが、解決策が私を顔で見つめていると確信しています。

答えて

3

その後、IDとすることによりグループはrleidLocationの列とることができます。

example[, Group := rleid(Location), ID] 
example 
# 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 

all.equal(example, expected_output) 
# [1] TRUE 
+2

完璧に動作しているようですが、あなたに感謝を!私はこれまで「激流」について知らなかった。 SOが私に許したらすぐに受け入れます。 – Gaffi

関連する問題