如何使用动态确定的列名和截止限制在data.table中选择行?

时间:2015-10-23 23:17:00

标签: r data.table

我想编写一个函数,从数据表中选择一个属于动态命名列的特定范围内的行。试着写这个,我发现自己无法通过将标准应用于动态确定的列来进行行选择。这是我的例子:

这很好用:

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]

我的解决方法是什么?

4 个答案:

答案 0 :(得分:3)

你需要两件事:

  1. 您的变量name应该是一个字符串,如"weight"
  2. 您需要致电eval(parse(text=name)),而不仅仅是eval(name)
  3. 例如,有一些假数据:

    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.nameas.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 名称。