我想编写一个函数,从数据表中选择一个属于动态命名列的特定范围内的行。试着写这个,我发现自己无法通过将标准应用于动态确定的列来进行行选择。这是我的例子:
这很好用:
library(data.table)
dt = data.table(weight=seq(150, 250, 10))
dt[weight < 200]
就像这样:
x = 200
dt[weight < x]
但这不起作用
name = weight
limit = 200
dt[eval(name) < limit]
我的解决方法是什么?
答案 0 :(得分:3)
你需要两件事:
name
应该是一个字符串,如"weight"
。eval(parse(text=name))
,而不仅仅是eval(name)
。例如,有一些假数据:
library(data.table)
dt <- data.table(weight=seq(150,250,10))
name <- "weight"
limit <- 200
dt[eval(parse(text=name)) < limit]
# weight
# 1: 150
# 2: 160
# 3: 170
# 4: 180
# 5: 190
答案 1 :(得分:1)
我们可以使用as.name
或as.symbol
dt[eval(as.name(name))< limit]
或者
dt[eval(as.symbol(name))< limit]
dt <- data.table(weight = c(150, 70, 250, 320), col2= LETTERS[1:4])
limit <- 200
name <- 'weight'
答案 2 :(得分:0)
另一种可能性,使用get()
:
library(data.table)
dt <- data.table(weight = seq(150, 250, 10))
name <- "weight"
limit <- 200
dt[get(name) < limit]
weight
1: 150
2: 160
3: 170
4: 180
5: 190
答案 3 :(得分:0)
剧透警告
使用 data.table
(下一个版本,已经在开发中)中使用自定义 substitute
函数的元编程。
name = "weight"
limit = 200
dt[name<limit, env=list(name=name, limit=limit)]
如果 limit
是一个字符串,您必须将它括在 I()
中,以防止将该值视为一个 var 名称。