R 使用不等式和变量列名筛选data.table

R 使用不等式和变量列名筛选data.table,r,data.table,inequality,R,Data.table,Inequality,我有一个数据表,我想根据一些不平等标准对其进行筛选: dt <- data.table(A=letters[1:3], B=2:4) dt # A B # 1: a 2 # 2: b 3 # 3: c 4 dt[B>2] # A B # 1: b 3 # 2: c 4 dt2] #A B #1:B3 #2:C4 上述方法可以很好地作为矢量扫描解决方案。但我不知道如何将其与列的变量名相结合: mycol <- "B" dt[mycol > 2] #

我有一个
数据表
,我想根据一些不平等标准对其进行筛选:

dt <- data.table(A=letters[1:3], B=2:4)
dt
#    A B
# 1: a 2
# 2: b 3
# 3: c 4

dt[B>2]
#    A B
# 1: b 3
# 2: c 4
dt2]
#A B
#1:B3
#2:C4
上述方法可以很好地作为矢量扫描解决方案。但我不知道如何将其与列的变量名相结合:

mycol <- "B"
dt[mycol > 2]
#    A B      // Nothing has changed
# 1: a 2
# 2: b 3
# 3: c 4
mycol2]
#没有什么变化
#1:a 2
#2:B3
#3:C4
我如何解决这个问题?我知道我可以通过使用setkeyv(dt,mycol)设置键来使用二进制搜索,但是我看不到一种基于一些不等式标准的二进制搜索方法。

好的,那么,
使用
get(mycol)
是因为您希望
dt[
的参数成为对象“mycol”的内容。我相信
dt[mycol…]
查找“mycol”
data.table
对象本身中的东西,当然没有这样的动物。

为此提供了一个accesor函数。
j
X
的框架中进行评估,即您的
data.table
,除非您指定
with=FALSE
。这是执行此操作的标准方法

dt[ , mycol , with = FALSE ]
   B
1: 2
2: 3
3: 4
返回列、逻辑比较、子集行

dt[ c( dt[ , mycol , with = FALSE ] > 2 ) ]

另一种方法是使用
]
检索B作为向量,并使用以下方法获取子集:

dt[dt[[mycol]] > 2]

get(mycl)
有效吗?@CarlWitthoft是的。这将是我缺少的函数…如果你愿意,你可以继续并将其作为答案发布。同样,这也有效
dt[eval(parse(text=mycl))>2]
@digeAll使用
eval(parse())
严格禁止使用
fortune(106)
@Mattrition请参阅更新。我不喜欢
get
,因为在某些嵌套调用环境中,您可能会遇到一些意外的行为。我认为提供
with=FALSE
是有原因的。好的,您的答案现在提供了一个不同的替代解决方案,谢谢。我发现的第三种选择是
dt[dt[[mycl]]>2]
@mattriion,这似乎是最明显的。你应该用这个来回答你自己的问题。我真的不喜欢这个和
[[
备选方案,因为它们更容易出错(因为你必须两次指定
数据表的名称)。这救了我。但即使你做了
dt['B'>2]
,你也必须做
dt[get('B')>2]
。有点烦人/似乎列引用应该作为字符串使用。@谢谢您的更正。我必须承认,我在过去4年中没有研究过这个问题!