Thực hiện setkey
ở đây sẽ tốn kém (ngay cả khi bạn sử dụng đặt hàng nhanh trong 1.8.11
), bởi vì nó cũng phải di chuyển dữ liệu (theo tham chiếu).
Tuy nhiên, bạn có thể giải quyết trường hợp này bằng cách sử dụng chức năng floor
. Về cơ bản, nếu bạn muốn tất cả các số trong [1,2] (Lưu ý: bao gồm 1 và 2 ở đây), thì floor
sẽ cung cấp giá trị "1" cho tất cả các giá trị này. Tức là, bạn có thể làm:
system.time(t1 <- dt[floor(a) == 1])
# user system elapsed
# 0.234 0.001 0.238
Điều này tương đương với làm dt[a >= 1 & a <=2]
và nhanh gấp hai lần.
system.time(t2 <- dt[a >= 1 & a <= 2])
# user system elapsed
# 0.518 0.081 0.601
identical(t1,t2) # [1] TRUE
Tuy nhiên, kể từ khi bạn không muốn sự bình đẳng, bạn có thể sử dụng một hack để trừ đi khoan dung = .Machine$double.eps^0.5
từ cột a
. Nếu giá trị nằm trong phạm vi [1, 1+tolerance)
, thì nó vẫn được coi là 1. Và nếu nó chỉ là nhiều hơn, thì nó không còn 1 nữa (nội bộ). Tức là, đó là số nhỏ nhất> 1 mà máy có thể xác định là không 1. Vì vậy, nếu bạn trừ 'a' bằng dung sai tất cả các số được biểu diễn bên trong là "1" sẽ trở thành < 1 và floor(.)
sẽ dẫn đến 0. Vì vậy, Thay vào đó, bạn sẽ nhận được dải ô> 1 và < 2. Tức là,
dt[floor(a-.Machine$double.eps^0.5)==1]
sẽ cho kết quả tương đương là dt[a>1 & a<2]
.
Nếu bạn đã làm điều này nhiều lần, sau đó có thể tạo ra một cột mới với floor
chức năng này và thiết lập quan trọng trên đó integer
cột có thể giúp:
dt[, fa := as.integer(floor(a-.Machine$double.eps^0.5))]
system.time(setkey(dt, fa)) # v1.8.11
# user system elapsed
# 0.852 0.158 1.043
Bây giờ, bạn có thể truy vấn bất kỳ phạm vi bạn muốn sử dụng tìm kiếm nhị phân:
> system.time(dt[J(1L)]) # equivalent to > 1 & < 2
# user system elapsed
# 0.071 0.002 0.076
> system.time(dt[J(1:4)]) # equivalent to > 1 & < 5
# user system elapsed
# 0.082 0.002 0.085
'between' sẽ không lưu bất kỳ lúc nào vì nó chứa mã' x> = lower & x <= upper'. 'dt [a> 1 & a <2]' sẽ chỉ nhanh như –
cách sử dụng thiết lập khóa? Tôi vừa cập nhật câu hỏi của mình không chắc chắn rằng tôi có thể thực hiện tìm kiếm có phạm vi trên một khóa. – Abhi