【问题标题】:How to perform logical operators through indexing in data.table at R?如何通过 R 的 data.table 中的索引来执行逻辑运算符?
【发布时间】:2017-12-06 05:30:50
【问题描述】:

我想弄清楚当我在data.table package 中使用索引 in R 时如何执行logical operators

以下是示例。我创建了一个名为dtdatatable。然后将var2 作为我的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)

所以现在我想确定我已经定义的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 &lt;10] 我就会得到结果。但是请考虑我想在data.table 中获得索引的概念,并理解并知道如何做到这一点,而无需在我的每个命令中调用key(var2)

非常感谢任何有关解释的帮助。

【问题讨论】:

  • dt[var2 &lt; 10]?解释是您需要将 something 指定为小于 10?
  • @Gregor,我知道这一点,这很明显!但是索引的概念是我不需要每次都调用列名(键)。那么,在我的命令中不调用var2 怎么办?
  • 来自?setkey?key 看起来你可以在桌子上调用key() 来获取密钥,所以dt[dt[[key(dt)]] &lt; 10] 可以做到这一点。您可能还想编辑问题以表明您希望以编程方式执行此操作,而无需在命令中调用 var2
  • @Gregor 感谢您提供的信息。尽管您的答案给出了正确的输出,但由于 data.table 中的 indexing 的概念是为了避免编写 LONG 命令,我希望应该有另一种更容易解决的方法。
  • 恐怕 dt[J()] 目前不适用于 non-equi 连接,因此您可以使用 dt[J(0:9), nomatch = 0L] 指定要连接的范围或执行dt[get(key(dt)) &lt; 10]dt[eval(as.name(key(dt))) &lt; 10] 或 Gregor 建议的内容。

标签: r indexing key data.table logical-operators


【解决方案1】:

?setkeykey(dt) 获取字符向量中的关键列。假设你的表有一个键列,那么你可以得到你想要的:

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

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

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

这有点短,可能是要走的路。

我能想到的另一种方法更糟糕:

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

【讨论】:

  • 还有dt[get(key(dt)) &lt; 10]dt[eval(as.name(key(dt))) &lt; 10]
【解决方案2】:

来自文档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...

问题在于 key(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]

这与@DavidArenburg 的简单而优雅的答案相同

【讨论】:

  • 恐怕不行!
  • 你测试过你的答案吗?
  • 我无法测试我的答案。我在办公室,无法使用 R
  • 查看链接。基本上你需要一个参数来选择数据。你试过了吗?你能粘贴错误吗?你还尝试了什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多