如何通过 R 中 data.table 中的索引执行逻辑运算符?
How to perform logical operators through indexing in data.table at R?
我想弄清楚当我在 R
中使用 indexing 时如何执行 logical operators
?
示例如下。我做了一个 datatable
命名为 dt
。然后将 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 <10]
我就会得到结果。但是请考虑我想在 data.table
中获得索引的概念,并理解并知道如何在不调用 key(var2)
的情况下在我的每个命令中进行索引!
非常感谢任何解释方面的帮助。
来自文档 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 简单而优雅的答案相同
从?setkey
、key(dt)
获取字符向量中的键列。假设你的 table 有一个键列,那么你可以得到你想要的:
dt[dt[[key(dt)]] < 10]
感谢 David Arenburg,您还可以使用 get()
:
dt[get(key(dt)) < 10]
这有点短,可能是要走的路。
我能想到的另一种方法更糟糕:
dt[eval(parse(text = paste(key(dt), "< 10")))]
我想弄清楚当我在 R
中使用 indexing 时如何执行 logical operators
?
示例如下。我做了一个 datatable
命名为 dt
。然后将 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 <10]
我就会得到结果。但是请考虑我想在 data.table
中获得索引的概念,并理解并知道如何在不调用 key(var2)
的情况下在我的每个命令中进行索引!
非常感谢任何解释方面的帮助。
来自文档 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 简单而优雅的答案相同
从?setkey
、key(dt)
获取字符向量中的键列。假设你的 table 有一个键列,那么你可以得到你想要的:
dt[dt[[key(dt)]] < 10]
感谢 David Arenburg,您还可以使用 get()
:
dt[get(key(dt)) < 10]
这有点短,可能是要走的路。
我能想到的另一种方法更糟糕:
dt[eval(parse(text = paste(key(dt), "< 10")))]