Два способи програмного вибору змінних:
with = FALSE
:
DT = data.table(col1 = 1:3)
colname = "col1"
DT[, colname, with = FALSE]
..
префікс 'dot dot' ( ):
DT[, ..colname]
Для подальшого опису позначення "точка-крапка" ( ..
) див. Нові функції в 1.10.2 (наразі це не описано в тексті довідки).
Щоб призначити змінну (и), оберніть LHS :=
в дужках:
DT[, (colname) := 4:6]
Останній відомий як plonk стовпця , оскільки ви замінюєте весь вектор стовпця посиланням. Якби підмножина i
була присутня, вона була б призначена за посиланням. Parens навколо (colname)
- це скорочення, представлене у версії v1.9.4 від CRAN жовтня 2014 р. Ось новина :
Використання with = FALSE
with :=
зараз застаріло у всіх випадках, враховуючи те, що обгортання LHS :=
з дужками було кращим протягом певного часу.
colVar = "col1"
DT[, colVar := 1, with = FALSE]
DT[, (colVar) := 1]
DT[, c("col1", "col2") := 1]
DT[, 2:4 := 1]
DT[, c("col1","col2") := list(sum(a), mean(b)]
DT[, `:=`(...), by = ...]
Див. Також розділ Деталі у ?`:=`
:
DT[i, (colnamevector) := value]
І щоб відповісти на подальше запитання в коментарі, ось один із способів (як зазвичай існує безліч способів):
DT[, colname := cumsum(get(colname)), with = FALSE]
або, ви можете знайти його легше читати, писати і налагоджувати тільки до , подібне побудова динамічного оператора SQL для відправки на сервер:eval
paste
expr = paste0("DT[,",colname,":=cumsum(",colname,")]")
expr
eval(parse(text=expr))
Якщо ви робите це багато, ви можете визначити допоміжну функцію EVAL
:
EVAL = function(...)eval(parse(text=paste0(...)),envir=parent.frame(2))
EVAL("DT[,",colname,":=cumsum(",colname,")]")
Тепер, коли data.table
1.8.2 автоматично оптимізує j
ефективність, можливо, краще використовувати eval
метод. Наприклад, get()
in j
запобігає деякій оптимізації.
Або є set()
. Низька накладна, функціональна форма :=
, що тут було б непогано. Див ?set
.
set(DT, j = colname, value = cumsum(DT[[colname]]))
DT