Как выбрать строки в данных.таблица с динамически определяемым именем столбца и ограничениями отсечения?


Я хотел бы написать функцию, которая выбирает строки из таблицы данных, которые попадают в определенный диапазон для динамически именованного столбца. Пытаясь написать это, я обнаружил, что не могу сделать выбор строк, применяя критерии к динамически определяемому столбцу. Вот мои примеры:

Это прекрасно работает:

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]

Каков здесь мой обходной путь?

2 2

2 ответа:

Вам нужны две вещи:

  1. ваша переменная name должна быть символьной строкой, как в "weight".
  2. вам нужно позвонить 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

Мы можем использовать либо 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'