Đôi khi tôi cần đếm số thành phần không phải là NA
trong một hoặc một cột khác trong data.table
của mình. Cách tốt nhất để làm như vậy là data.table
?Đo đếm hiệu quả các yếu tố phi NA trong dữ liệu. Có thể
Đối concreteness, chúng ta hãy làm việc với điều này:
DT <- data.table(id = sample(100, size = 1e6, replace = TRUE),
var = sample(c(1, 0, NA), size = 1e6, replace = TRUE), key = "id")
Việc đầu tiên mà nói đến cái tâm của tôi làm việc như thế này:
DT[!is.na(var), N := .N, by = id]
Nhưng điều này có thiếu sót đáng tiếc rằng N
không được giao vào bất kỳ hàng nào thiếu var
, nghĩa là DT[is.na(var), N] = NA
.
Vì vậy, tôi làm việc xung quanh này bằng cách phụ thêm:
DT[!is.na(var), N:= .N, by = id][ , N := max(N, na.rm = TRUE), by = id] #OPTION 1
Tuy nhiên, tôi không chắc chắn đây là cách tiếp cận tốt nhất; một lựa chọn Tôi nghĩ đến và một đề xuất bởi các analog để this câu hỏi cho data.frame
s sẽ là:
DT[ , N := length(var[!is.na(var)]), by = id] # OPTION 2
và
DT[ , N := sum(!is.na(var)), by = id] # OPTION 3
So sánh thời gian tính toán trong số này (trung bình hơn 100 thử nghiệm), dường như cuối cùng là nhanh nhất:
OPTION 1 | OPTION 2 | OPTION 3
.075 | .065 | .043
Có ai biết cách nhanh hơn cho data.table
không?
@MichaelChirico, có một cái nhìn tại [Keys và tìm kiếm dựa tập con nhị phân] (https://github.com/Rdatatable/data.table/wiki/Getting-started) (và để chúng tôi biết nếu bạn tìm thấy một cái gì đó không rõ ràng/được thêm vào [ở đây] (https://github.com/Rdatatable/data.table/issues/944) – Arun
Có một tùy chọn khác: 'dt5 [,. N [! is. na (var)], bởi = id] '- thứ ba nhanh nhất trên hệ thống của tôi và khá hơn rất nhiều so với tùy chọn 1 và 2. Đối với một số lý do tùy chọn 3 tạo ra phản hồi nhị phân (0,1) thay vì đếm nếu nhiều hơn một ' 'biến được sử dụng. Tùy chọn được đề xuất 5 cho số đếm chính xác. –