代码之家  ›  专栏  ›  技术社区  ›  Daniel

如何通过在数据中建立索引来执行逻辑运算符。R处的桌子?

  •  5
  • Daniel  · 技术社区  · 7 年前

    我在想我该怎么做 logical operators 当我使用 索引 在里面 data.table package R ?

    datatable dt 。然后 var2 数据表 :

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

    现在我想确定我已经定义的 key (var2) less than 10 ( <10) .做以下尝试给我 errors .

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

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

    顺便说一句,我知道只要做 dt[var2 <10] 我会得到结果的。但是请考虑一下,我想在 data.table key(var2)

    如有任何帮助,我们将不胜感激。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Gregor Thomas    7 年前

    ?setkey , key(dt) 获取字符向量中的键列。假设您的表有一个单键列,那么您可以使用以下内容:

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

    感谢David Arenburg,您还可以使用 get() :

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

    我认为另一种方法更糟糕:

    dt[eval(parse(text = paste(key(dt), "< 10")))]
    
        2
  •  1
  •   Ajay Ohri    7 年前

    来自文档 https://www.rdocumentation.org/packages/data.table/versions/1.10.4/topics/setkey

    如果可能的话,这是解决方案的关键

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

    问题在于键(DT)给出“var2”,而数据表中的子集需要var2(不带引号)-我们使用 get

    所以现在使用 Remove quotes from a character vector in R

    这是最简单的方法

    #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
    

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