2015-08-22 8 views
5

Fühlen Sie sich frei, diesen Titel zu bearbeiten, um sie verallgemeinerbar/...data.table: Mark vor/nach in Gruppen von Symbol Auftreten

Ich habe ein data.table Objekt mit 3 Spalten verständlicher zu machen, die Form Gruppen (id, id2pol_loc). Innerhalb dieser Gruppen sind Zeilenbeobachtungen und für jede Gruppe wird ein Stern in einer Reihe oder ein NA angezeigt. Ich möchte effizient eine Indikatorspalte für jede Gruppe der Reihe relativ zu den Sternchen machen (vor - 1, nach - 0). Hier ist, was die Datentabelle wie folgt aussieht:

id id2 pol_loc non_pol cluster_tag 
1: 1 1  3  do   NA 
2: 1 1  3  you   NA 
3: 1 1  3  *   NA 
4: 1 1  3  it   NA 
------------------------------------- 
5: 1 2  3  but   4 
6: 1 2  3  i   NA 
7: 1 2  3  *   NA 
8: 1 2  3 really   2 
9: 1 2  3  bad   NA 
------------------------------------- 
10: 1 2  5  but   4 
11: 1 2  5  i   NA 
12: 1 2  5 hate   NA 
13: 1 2  5 really   2 
14: 1 2  5  *   NA 
15: 1 2  5 dogs   NA 
------------------------------------- 
16: 2 1  4  i   NA 
17: 2 1  4  am   NA 
18: 2 1  4  the   NA 
19: 2 1  4  *   NA 
20: 2 1  4 friend   NA 
------------------------------------- 
21: 3 1  4  do   NA 
22: 3 1  4  you   NA 
23: 3 1  4 really   2 
24: 3 1  4  *   NA 
------------------------------------- 
25: 3 2  NA  NA   NA 
    id id2 pol_loc non_pol cluster_tag 

Wunsch Ausgang:

Hier ist die gewünschte Ausgabe:

id id2 pol_loc non_pol cluster_tag before 
1: 1 1  3  do   NA  1 
2: 1 1  3  you   NA  1 
3: 1 1  3  *   NA  NA 
4: 1 1  3  it   NA  0 
---------------------------------------------- 
5: 1 2  3  but   4  1 
6: 1 2  3  i   NA  1 
7: 1 2  3  *   NA  NA 
8: 1 2  3 really   2  0 
9: 1 2  3  bad   NA  0 
---------------------------------------------- 
10: 1 2  5  but   4  1 
11: 1 2  5  i   NA  1 
12: 1 2  5 hate   NA  1 
13: 1 2  5 really   2  1 
14: 1 2  5  *   NA  NA 
15: 1 2  5 dogs   NA  0 
---------------------------------------------- 
16: 2 1  4  i   NA  1 
17: 2 1  4  am   NA  1 
18: 2 1  4  the   NA  1 
19: 2 1  4  *   NA  NA 
20: 2 1  4 friend   NA  0 
---------------------------------------------- 
21: 3 1  4  do   NA  1 
22: 3 1  4  you   NA  1 
23: 3 1  4 really   2  1 
24: 3 1  4  *   NA  NA 
---------------------------------------------- 
25: 3 2  NA  NA   NA  NA 
    id id2 pol_loc non_pol cluster_tag before 

MWE

dat <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), 
    id2 = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L), pol_loc = c(3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, NA), non_pol = c("do", "you", 
    "*", "it", "but", "i", "*", "really", "bad", "but", "i", 
    "hate", "really", "*", "dogs", "i", "am", "the", "*", "friend", 
    "do", "you", "really", "*", NA), cluster_tag = c(NA, NA, 
    NA, NA, "4", NA, NA, "2", NA, "4", NA, NA, "2", NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, "2", NA, NA)), row.names = c(NA, 
-25L), class = "data.frame", .Names = c("id", "id2", "pol_loc", 
"non_pol", "cluster_tag")) 

library(data.table) 

setDT(dat) 

EDIT Wenn es einfacher oder effizienter macht, kann die NA s 0 oder 1 werden Es macht keinen Unterschied und ich denke, das ist effizienter.

Antwort

5

Versuchen

dat[, before:=1-cumsum(non_pol=="*"), by=.(id, id2, pol_loc)][non_pol=="*", before:=NA,] 
+0

Dieses viel besser ist. – akrun

+1

Schön einfach aber ich hätte nicht gedacht diese Route zu gehen. Genial. –

+0

'1-cumsum' sieht für mich bizarr aus, um 0/1 vars zu erstellen. Ich würde mit 'before: = + (. I <= .I [which (non_pol ==" * ")])' oder '1: .N <= which (non_pol ==" * ")' – Frank