Удаление нескольких столбцов из R data.table с параметром для удаления столбцов
Я пытаюсь манипулировать несколькими data.tables аналогичным образом и хотел бы написать функцию для выполнения этого. Я хотел бы передать параметр, содержащий список столбцов, в котором выполнялись бы операции. Это отлично работает, когда векторное объявление столбцов является левой стороной оператора: =, но не если оно объявлено ранее (или передано в функцию). Следующий код показывает проблему.
dt = data.table(a = letters, b = 1:2, c=1:13)
colsToDelete = c('b', 'c')
dt[,colsToDelete := NULL] # doesn't work but I don't understand why not.
dt[,c('b', 'c') := NULL] # works fine, but doesn't allow passing in of columns
Ошибка: "Добавить новый столбец" colsToDelete ", а затем присвоить NULL (удалить его)". Таким образом, он интерпретирует "colsToDelete" как новое имя столбца.
Такая же проблема возникает при выполнении чего-то в этом направлении
dt[, colNames := lapply(.SD, adjustValue, y=factor), .SDcols = colNames]
Я новичок в R, но более опытен с некоторыми другими языками, так что это может быть глупый вопрос.
Ответы
Ответ 1
Это в основном потому, что мы разрешаем символам на LHS :=
добавлять новые столбцы для удобства: ex: DT[, col := val]
. Итак, чтобы отличить col
как имя от того, что хранится в col
, это имена столбцов, мы проверяем, является ли LHS name
или expression
.
Если это a name
, он добавляет столбец с именем как таковым на LHS, а если expression
, то он получает оценку.
DT[, col := val] # col is the column name.
DT[, (col) := val] # col gets evaluated and replaced with its value
DT[, c(col) := val] # same as above
Предпочтительная идиома: dt[, (colsToDelete) := NULL]
НТН
Ответ 2
Чтобы расширить предыдущий ответ, вы можете удалить столбцы по ссылке:
# delete columns 10 to 15
dt[ , (10:15) := NULL ]
или
# delete columns 3, 5 and 10 to 15
dt[ , (c(3,5,10:15)) := NULL ]