2017-07-03 24 views
5

Tôi đang cố gắng tìm hiểu cách tôi có thể thực hiện logical operators khi tôi sử dụng lập chỉ mục trong data.table package trong R?Làm thế nào để thực hiện các toán tử logic thông qua việc lập chỉ mục trong data.table tại R?

Sau đây là ví dụ. Tôi tạo một datatable có tên là dt. và sau đó làm cho var2 là chìa khóa trong datatable tôi:

> dt = data.table(var1 = rep(LETTERS[1:5],2), var2 = seq(1,20, 2), var3 = ceiling(rnorm(10, 3, 2))) 
> dt 
    var1 var2 var3 
1: A 1 5 
2: B 3 3 
3: C 5 0 
4: D 7 6 
5: E 9 3 
6: A 11 4 
7: B 13 2 
8: C 15 1 
9: D 17 3 
10: E 19 7 

> setkey(dt, var2) 

Vì vậy, bây giờ tôi muốn xác định tất cả các giá trị trong tôi đã được xác định key (var2)less than 10 (<10). Thực hiện các bước sau đây cho tôi errors.

> dt[ < 10] 
Error: unexpected '<' in "dt[ <" 
> dt[ .< 10] 
Error in eval(expr, envir, enclos) : object '.' not found 
> dt[ .(< 10)] 

mong đợi của tôi sẽ là:

 var1 var2 var3 

1: A 11 4 
2: B 13 2 
3: C 15 1 
4: D 17 3 
5: E 19 7 

BTW, tôi biết rằng chỉ bằng cách làm tôi sẽ nhận được kết quả. NHƯNG xin vui lòng xem xét rằng tôi muốn có được các khái niệm về lập chỉ mục trong data.table và hiểu và biết làm thế nào để làm điều đó mà không cần gọi key(var2) trong mỗi lệnh của tôi!

Bất kỳ trợ giúp nào được giải thích đều được đánh giá cao.

+1

'dt [var2 <10] '?Với lời giải thích là bạn cần chỉ định * cái gì đó * nhỏ hơn 10? – Gregor

+1

@Gregor, tôi biết điều này và nó rất rõ ràng! Nhưng khái niệm lập chỉ mục là tôi KHÔNG cần phải gọi tên cột (khóa) mỗi lần. vì vậy, làm thế nào tôi có thể làm điều đó mà không gọi 'var2' trong lệnh của tôi? – Daniel

+1

Từ '? Setkey' hoặc'? Key', có vẻ như bạn có thể gọi 'key()' trên một bảng để lấy khóa, vì vậy 'dt [dt [[key (dt)]] <10]' hoạt động cho điều đó . Bạn cũng có thể muốn chỉnh sửa câu hỏi để làm cho nó nói rằng bạn muốn làm điều đó theo chương trình mà không cần gọi 'var2' trong lệnh của bạn. – Gregor

Trả lời

3

Từ ?setkey, key(dt) được các cột quan trọng trong một nhân vật vector. Giả sử bảng của bạn có một cột quan trọng duy nhất, sau đó bạn có thể có được những gì bạn muốn với:

dt[dt[[key(dt)]] < 10] 

Nhờ David Arenburg, bạn cũng có thể sử dụng get():

dt[get(key(dt)) < 10] 

Đây là một chút ngắn hơn và có lẽ là con đường để đi.

Một cách khác tôi có thể nghĩ để làm điều đó là tồi tệ hơn nhiều:

dt[eval(parse(text = paste(key(dt), "< 10")))] 
+3

Ngoài ra 'dt [lấy (khóa (dt)) <10]' và 'dt [eval (as.name (khóa (dt))) <10]' –

1

từ tài liệu https://www.rdocumentation.org/packages/data.table/versions/1.10.4/topics/setkey

Đây là một chìa khóa để các giải pháp, nếu có thể

> library(data.table) 
data.table 1.10.4 
    The fastest way to learn (by data.table authors): https://www.datacamp.com/courses/data-analysis-the-data-table-way 
    Documentation: ?data.table, example(data.table) and browseVignettes("data.table") 
    Release notes, videos and slides: http://r-datatable.com 
> data(mtcars) 
> head(mtcars) 
        mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4   21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 
Mazda RX4 Wag  21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 
Datsun 710  22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
Valiant   18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 

> mtcars=data.table(mtcars) 
> setkey(mtcars,mpg) 
> key(mtcars) 
[1] "mpg" 


> mtcars[mpg<15,,] 
    mpg cyl disp hp drat wt qsec vs am gear carb 
1: 10.4 8 472 205 2.93 5.250 17.98 0 0 3 4 
2: 10.4 8 460 215 3.00 5.424 17.82 0 0 3 4 
3: 13.3 8 350 245 3.73 3.840 15.41 0 0 3 4 
4: 14.3 8 360 245 3.21 3.570 15.84 0 0 3 4 
5: 14.7 8 440 230 3.23 5.345 17.42 0 0 3 4 
> mtcars["mpg"<15,,] 
Empty data.table (0 rows) of 11 cols: mpg,cyl,disp,hp,drat,wt... 

Vấn đề nằm đó chính (DT) là cho "var2" trong khi tập con trong một nhu cầu var2 DataTable (mà không có dấu ngoặc kép) - chúng tôi có được điều này bằng get

Bây giờ sử dụng Remove quotes from a character vector in R

Đây là Simp kẻo cách

#get(key(mtcars)) 

    > mtcars[get(key(mtcars))<15] 
    mpg cyl disp hp drat wt qsec vs am gear carb 
1: 10.4 8 472 205 2.93 5.250 17.98 0 0 3 4 
2: 10.4 8 460 215 3.00 5.424 17.82 0 0 3 4 
3: 13.3 8 350 245 3.73 3.840 15.41 0 0 3 4 
4: 14.3 8 360 245 3.21 3.570 15.84 0 0 3 4 
5: 14.7 8 440 230 3.23 5.345 17.42 0 0 3 4 

Đối với DataTable của bạn nó sẽ được

DT[get(key(DT))<10] 

mà là giống như câu trả lời @DavidArenburg 's đơn giản và thanh lịch

+1

Tôi không sợ! – Daniel

+1

Bạn thậm chí có kiểm tra câu trả lời của mình không? –

+0

Tôi không thể kiểm tra câu trả lời của mình. Tôi đang ở văn phòng và không thể sử dụng R –

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