在 R 中将 setkey 与 data.table 结合使用时是否可以包含 >=、<= 运算符?
Is it possible to include >=, <= operators when using setkey with data.table in R?
我正在查看 data.table
的简短教程
https://www.r-bloggers.com/r-data-table-tutorial-with-50-examples/
但是当作者谈到 setkey()
时我卡住了
我举个例子。我使用 iris 数据库,因此可以轻松复制
mydata <- as.data.table(iris)
#Change variable names
mydata <- setnames(mydata, c("Sepal.Length","Sepal.Width", "Petal.Length", "Petal.Width", "Species"),
c("sepal_length", "sepal_width", "petal_length", "petal_width", "species"))
现在我将使用一个因子变量和一个数值变量作为键:
setkey(mydata, species, petal_length)
使用这个效果很好:
> mydata[.("setosa", 1.4)]
sepal_length sepal_width petal_length petal_width species
1: 5.1 3.5 1.4 0.2 setosa
2: 4.9 3.0 1.4 0.2 setosa
3: 5.0 3.6 1.4 0.2 setosa
4: 4.6 3.4 1.4 0.3 setosa
5: 4.4 2.9 1.4 0.2 setosa
6: 4.8 3.0 1.4 0.1 setosa
7: 5.1 3.5 1.4 0.3 setosa
8: 5.2 3.4 1.4 0.2 setosa
9: 5.5 4.2 1.4 0.2 setosa
10: 4.9 3.6 1.4 0.1 setosa
11: 4.8 3.0 1.4 0.3 setosa
12: 4.6 3.2 1.4 0.2 setosa
13: 5.0 3.3 1.4 0.2 setosa
但这会引发错误:
mydata[.("setosa", <1.4)]
Error: inesperado '<' in "mydata[.("setosa", <"
所以我的问题是在使用 setkey
搜索时是否可以包含 >、<、>=、<=,因为该函数应该适用于任何类型的变量。如果是,调用 mydata[.("setosa", <1.4)]
之类的内容的正确形式是什么
我看过:
R data.table setkey with numeric column
R data.table 1.9.2 issue on setkey
但没有找到任何有用的答案来回答我的问题。
我也阅读了 data.table
文档,但没有有用的示例。
任何意见将不胜感激。
我发现了一些可以使用 seq
函数的东西。
假设我想检索 setosa 的观测值,其在 petal_length 之间,从 1.4 到 2。
按照我原来问题中的例子,我们可以使用:
na.omit(mydata[.("setosa", seq(1.4,2, 0.1))])
returns 我们想要的观察结果。
seq(1.4, 2, 0.1)
returns 从 1.4 到 2 的序列,步长为 0.1。这会在 data.table 中查找值并生成 1.6、1.8 和 1.9 的观测值,它们是 NA。这就是为什么调用的第一个函数是 na.omit
希望这对某些人有用。
您似乎是在进行子集化而不是提取相同的匹配项。下面的感觉更像是自然语法
mydata[species=="setosa" & petal_length < 1.4]
或 non-equi 像这样加入
mydata[.(species="setosa", i.petal_length=1.4), on=.(species, petal_length < i.petal_length)]
我正在查看 data.table
的简短教程https://www.r-bloggers.com/r-data-table-tutorial-with-50-examples/
但是当作者谈到 setkey()
我举个例子。我使用 iris 数据库,因此可以轻松复制
mydata <- as.data.table(iris)
#Change variable names
mydata <- setnames(mydata, c("Sepal.Length","Sepal.Width", "Petal.Length", "Petal.Width", "Species"),
c("sepal_length", "sepal_width", "petal_length", "petal_width", "species"))
现在我将使用一个因子变量和一个数值变量作为键:
setkey(mydata, species, petal_length)
使用这个效果很好:
> mydata[.("setosa", 1.4)]
sepal_length sepal_width petal_length petal_width species
1: 5.1 3.5 1.4 0.2 setosa
2: 4.9 3.0 1.4 0.2 setosa
3: 5.0 3.6 1.4 0.2 setosa
4: 4.6 3.4 1.4 0.3 setosa
5: 4.4 2.9 1.4 0.2 setosa
6: 4.8 3.0 1.4 0.1 setosa
7: 5.1 3.5 1.4 0.3 setosa
8: 5.2 3.4 1.4 0.2 setosa
9: 5.5 4.2 1.4 0.2 setosa
10: 4.9 3.6 1.4 0.1 setosa
11: 4.8 3.0 1.4 0.3 setosa
12: 4.6 3.2 1.4 0.2 setosa
13: 5.0 3.3 1.4 0.2 setosa
但这会引发错误:
mydata[.("setosa", <1.4)]
Error: inesperado '<' in "mydata[.("setosa", <"
所以我的问题是在使用 setkey
搜索时是否可以包含 >、<、>=、<=,因为该函数应该适用于任何类型的变量。如果是,调用 mydata[.("setosa", <1.4)]
我看过:
R data.table setkey with numeric column
R data.table 1.9.2 issue on setkey
但没有找到任何有用的答案来回答我的问题。
我也阅读了 data.table
文档,但没有有用的示例。
任何意见将不胜感激。
我发现了一些可以使用 seq
函数的东西。
假设我想检索 setosa 的观测值,其在 petal_length 之间,从 1.4 到 2。
按照我原来问题中的例子,我们可以使用:
na.omit(mydata[.("setosa", seq(1.4,2, 0.1))])
returns 我们想要的观察结果。
seq(1.4, 2, 0.1)
returns 从 1.4 到 2 的序列,步长为 0.1。这会在 data.table 中查找值并生成 1.6、1.8 和 1.9 的观测值,它们是 NA。这就是为什么调用的第一个函数是 na.omit
希望这对某些人有用。
您似乎是在进行子集化而不是提取相同的匹配项。下面的感觉更像是自然语法
mydata[species=="setosa" & petal_length < 1.4]
或 non-equi 像这样加入
mydata[.(species="setosa", i.petal_length=1.4), on=.(species, petal_length < i.petal_length)]