2012-10-19 16 views
7

Tôi muốn đánh số kết hợp một số hàng trong một dataframe (được đặt trên ID và trên Time)hàng số bằng cách thay đổi, nhưng bắt đầu lại khi điều kiện là hit

tc <- textConnection(' 
id    time  end_yn 
abc    10   0 
abc    11   0 
abc    12   1 
abc    13   0 
def    10   0 
def    15   1 
def    16   0 
def    17   0 
def    18   1 
') 

test <- read.table(tc, header=TRUE) 

Mục đích là để tạo ra một mới cột ("number") đánh số mỗi hàng trên id từ 1 to n cho đến khi end_yn == 1 bị nhấn. Sau end_yn == 1, việc đánh số sẽ bắt đầu lại.

Nếu không lấy trạng end_yn == 1 vào tài khoản các hàng có thể được đánh số sử dụng:

DT <- data.table(test) 
DT[, id := seq_len(.N), by = id] 

Tuy nhiên, kết quả mong đợi nên là:

id    time  end_yn number 
abc    10   0  1 
abc    11   0  2 
abc    12   1  3 
abc    13   0  1 
def    10   0  1 
def    15   1  2 
def    16   0  1 
def    17   0  2 
def    18   1  3 

Làm thế nào để kết hợp các điều kiện end_yn == 1?

Trả lời

5

Tôi đoán có những cách khác nhau để làm điều này, nhưng đây là một:

DT[, cEnd := c(0,cumsum(end_yn)[-.N])] # carry the end value forward 

DT[, number := seq_len(.N), by = "id,cEnd"] # create your sequence 

DT[, cEnd := NULL] # remove the column created above 

Thiết id là chìa khóa cho DT thể là giá trị thời gian.

+0

Rất thông minh để mang giá trị cuối cùng về phía trước. Đây chính xác là những gì tôi cần và hoạt động nhanh hơn nhiều so với giải pháp ban đầu của tôi. Cảm ơn! –

+0

Điều gì sẽ xảy ra nếu tôi muốn cung cấp cho tất cả các mục nhập cùng một số cho đến khi điều kiện end_yn được nhấn? Vì vậy, hãy cung cấp số giá trị 1 cho đến khi end_yn = 1 lần đầu tiên, sau đó 2 cho đến khi end_yn = 1 cho lần thứ hai, sau đó là 3 v.v. (trên mỗi coockie_id). seq_len (.N) cần phải được thay thế Tôi nghĩ, nhưng tôi không thể tìm ra những gì –

+1

@MaxvanderHeijden, cho rằng, bạn có thể thử một cái gì đó như 'DT [, number: = cumsum (end_yn) + 1, by =" id " ] ', nhưng điều đó sẽ bắt đầu đánh số tại' 2' nếu 'end_yn' là' 1' cho mục nhập đầu tiên của 'id'. Hãy thử tìm kiếm thẻ data.table trên SO, vì một câu hỏi tương tự có thể đã được yêu cầu. – BenBarnes