2017-06-22 17 views
6

Tôi đang cố gắng tạo một cột mới cho biết ID có xuất hiện trong nhóm trước đó hay không. Đây là dữ liệu của tôi:Đối sánh trong nhóm bị tụt hậu trong dữ liệu.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 

Tôi không chắc chắn cách chỉ định nhóm bị trễ. Tôi đã cố sử dụng shift nhưng không hoạt động:

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

Đây là kết quả mong muốn của tôi.

3 dòng đầu tiên không khớp vì không có nhóm trước. FALSE cũng sẽ làm việc cho ba hàng này. ID = 4 (trong nhóm b) không khớp với nhóm a. ID = 5 (trong nhóm c) không khớp với nhóm b.

Lưu ý rằng ID 1 trong nhóm c không được đối sánh trong nhóm b, vì vậy nó phải là sai mặc dù nó tồn tại trong nhóm a. Đây là lý do tại sao duplicated(data$ID) không hoạt động. Dữ liệu từ một nhóm phải được đối sánh từ nhóm trước đó.

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 

Một giải pháp dplyr cũng sẽ hoạt động.

+0

'trùng lặp (dữ liệu $ ID)' không hoạt động? –

+1

@ d.b Không, dữ liệu từ một nhóm phải được khớp từ nhóm ** trước đó **. Tôi đã chỉnh sửa câu hỏi để làm cho nó rõ ràng hơn về lý do tại sao 'trùng lặp' không hoạt động. –

Trả lời

0

Tác phẩm này. Có lẽ là một giải pháp dễ dàng hơn:

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

Số các nhóm, và sau đó kiểm tra xem diff bằng một cho mỗi 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 

Giả định rằng bạn tìm thấy mỗi ID chỉ một lần trong mỗi nhóm. Nếu đó không phải là trường hợp bạn có thể duy nhất, hãy làm như trên và sau đó hợp nhất.

Các vấn đề liên quan