2015-08-22 8 views
5

इस शीर्षक को संपादित करने के लिए स्वतंत्र महसूस इसे और अधिक समझ में आता है/generalizable बनाने के लिए ...data.table: मार्क से पहले/समूहों के भीतर प्रतीक की घटना के बाद

मैं 3 कॉलम कि फार्म के साथ एक data.table वस्तु है समूह (id, id2pol_loc)। इन समूहों के भीतर पंक्ति अवलोकन हैं और प्रत्येक समूह या NA के लिए कुछ पंक्तियों पर एक तारांकन होगा। मैं तारों के सापेक्ष पंक्ति के प्रत्येक समूह के लिए कुशलतापूर्वक संकेतक बनाना चाहता हूं (पहले - 1, बाद में 0)।

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 

वांछित उत्पादन:

यहाँ वांछित आउटपुट है: यहाँ डेटा तालिका कैसा दिखाई देता है है

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 

मेगावाट

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 यदि यह NA एस 0 या 1 बन सकता है तो यह आसान या अधिक कुशल बनाता है यह कोई फर्क नहीं पड़ता है और मुझे लगता है कि यह अधिक कुशल है।

उत्तर

5

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

प्रयास करें यह एक बहुत बेहतर है। – akrun

+1

अच्छा सरल लेकिन मैं इस मार्ग पर जाने के लिए सोचा नहीं होता। बहुत बढ़िया। –

+0

'1-cumsum' 0/1 युद्ध बनाने के लिए मेरे लिए विचित्र लग रहा है। मैं पहले से जाऊंगा: = + (। I <= I. [जो (non_pol == "*")]) 'या '1: .N <= जो (non_pol ==" * ")' – Frank

संबंधित मुद्दे