2017-07-03 101 views
5

Próbuję dowiedzieć się, jak mogę wykonać logical operators, gdy używam indeksowania w data.table package w R?Jak wykonywać operatory logiczne przez indeksowanie w data.table w R?

Poniżej znajduje się przykład. Tworzę datatable o nazwie dt. a następnie dokonać var2 jako klucz w moim datatable:

> 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) 

Więc teraz chcę zidentyfikować wszystkie wartości w moim już zdefiniowane key (var2) które są less than 10 (<10). Wykonanie następujących prób daje mi errors.

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

moje oczekiwanie będzie:

 var1 var2 var3 

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

BTW, wiem, że po prostu wykonując dostanę wynik. ALE rozważcie proszę, że chcę uzyskać pojęcie indeksowania w data.table i zrozumieć i wiedzieć, jak to zrobić bez wywoływania key(var2) w każdym moim poleceniu!

Każda pomoc w wyjaśnieniu jest bardzo cenna.

+1

'dt [VAR2 <10]'?Z wyjaśnieniem, że musisz określić * coś *, aby było mniej niż 10? – Gregor

+1

@Gregor, wiem o tym i jest to bardzo oczywiste! Ale pojęcie indeksowania polega na tym, że NIE muszę wywoływać nazwy kolumny (klucza) za każdym razem. tak, jak mogę to zrobić bez wywoływania 'var2' w moim poleceniu? – Daniel

+1

Z '? Setkey' lub'? Key' wygląda na to, że możesz wywołać 'key()' w tabeli, aby uzyskać klucz, więc 'dt [dt [[key (dt)]] <10]' działa na to . Możesz również edytować pytanie, aby zaznaczyć, że chcesz to zrobić programowo bez wywoływania polecenia 'var2' w twoim poleceniu. – Gregor

Odpowiedz

3

Od ?setkey, key(dt) dostać klucz kolumny w charakterze wektor. Zakładając, że tabela ma pojedyncza kolumna klucz, a następnie można dostać to, co chcesz z:

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

Dzięki David Arenburg, można również użyć get():

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

To jest trochę krótszy i prawdopodobnie droga.

Innym sposobem można myślę, aby to zrobić jest znacznie gorzej:

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

Również 'dt [get (key (dt)) <10]' i 'dt [eval (as.name (key (dt))) <10] –

1

z dokumentacją https://www.rdocumentation.org/packages/data.table/versions/1.10.4/topics/setkey

Oto klucz do rozwiązania, jeśli to możliwe

> 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... 

Problem polega, że ​​klucz (DT) daje "var2", podczas gdy podzbiór w DataTable zapotrzebowaniem VAR2 (bez cudzysłowów) - możemy uzyskać za pomocą get

Więc teraz używając Remove quotes from a character vector in R

to SIMP bo sposób

#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 

Dla Twojej DataTable będzie

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

która jest taka sama jak prosty i elegancki odpowiedź @DavidArenburg „s

+1

Obawiam się, że nie! – Daniel

+1

Czy sprawdziłeś swoją odpowiedź? –

+0

Nie mogę przetestować mojej odpowiedzi. Jestem w biurze i nie mogę korzystać z R –