2017-06-22 8 views
6

में लगी हुई समूह में मिलान करें मैं एक नया कॉलम बनाने की कोशिश कर रहा हूं जो इंगित करता है कि पिछले समूह में कोई आईडी मौजूद थी या नहीं। यहां मेरा डेटा है:डेटा.table

data <- data.table(ID = c(1:3, c(9,2,3,4),c(5,1)), 
        groups = c(rep(c("a", "b", "c"), c(3, 4,2)))) 
    ID groups 
1: 1  a 
2: 2  a 
3: 3  a 
4: 9  b 
5: 2  b 
6: 3  b 
7: 4  b 
8: 5  c 
9: 1  c 

मुझे यकीन नहीं है कि कैसे लगी हुई समूहों को निर्दिष्ट करना है। मैं shift का उपयोग करने की कोशिश की, लेकिन यह काम नहीं कर रहा:

data[,.(ID=ID,match_lagged=ID %in% shift(ID)),by=groups] 

यहाँ मेरी वांछित परिणाम है।

पहली 3 लाइनें मेल नहीं खाती हैं क्योंकि कोई पिछला समूह नहीं है। इन तीन पंक्तियों के लिए गलत काम भी करेगा। आईडी = 4 (समूह बी में) समूह ए में मेल नहीं खाता है। आईडी = 5 (समूह सी में) समूह बी में मेल नहीं खाता है।

ध्यान दें कि समूह सी में आईडी 1 समूह बी में मेल नहीं खाता है, इसलिए यह समूह में मौजूद होने पर भी गलत होना चाहिए। यही कारण है कि duplicated(data$ID) काम नहीं करता है। किसी समूह से डेटा पिछले समूह से मेल खाना चाहिए।

groups ID match_lagged 
1:  a 1   NA 
2:  a 2   NA 
3:  a 3   NA 
4:  b 9   FALSE 
5:  b 2   TRUE 
6:  b 3   TRUE 
7:  b 4   FALSE 
8:  c 5   FALSE 
9:  c 1   FALSE 

dplyr समाधान भी काम करेगा।

+0

'डुप्लीकेट (डेटा $ आईडी)' काम नहीं करता है? –

+1

@ डी.बी. नहीं, एक समूह से डेटा ** पिछले ** समूह से मेल खाना चाहिए। मैंने इस सवाल को संपादित किया कि यह क्यों स्पष्ट है कि 'डुप्लिकेट' क्यों काम नहीं करता है। –

उत्तर

0

यह काम करता है। शायद एक आसान उपाय है:

data <- data.frame(ID = c(1:3, 1:4,c(5,1)), 
        groups = c(rep(c("a", "b", "c"), c(3, 4,2)))) 

z <- data %>% group_by(groups) %>% summarize(all_vals = list(ID)) 
z <- z %>% mutate(lagged_id = lag(all_vals,1)) 

match_lagged <- lapply(1:nrow(z) , function(x) { 
    (z$all_vals[x] %>% unlist) %in% (z$lagged_id[x] %>% unlist) 
}) 

data$match_lagged = match_lagged %>% unlist 
1

संख्या समूहों, और उसके बाद जाँच लें कि diff प्रत्येक ID के लिए एक के बराबर है।

data[, grp.id := .GRP, by = groups] 
data[, match_lagged := c(FALSE, diff(grp.id) == 1), by = ID][ 
    grp.id == 1, match_lagged := NA][] 
# ID groups grp.id match_lagged 
#1: 1  a  1   NA 
#2: 2  a  1   NA 
#3: 3  a  1   NA 
#4: 9  b  2  FALSE 
#5: 2  b  2   TRUE 
#6: 3  b  2   TRUE 
#7: 4  b  2  FALSE 
#8: 5  c  3  FALSE 
#9: 1  c  3  FALSE 

इसका मतलब यह है कि आप केवल प्रत्येक समूह में एक बार प्रत्येक ID पाते हैं कि। यदि ऐसा नहीं है तो आप अद्वितीय कर सकते हैं, उपर्युक्त करें, और उसके बाद विलय करें।

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