Подтвердить что ты не робот

Удаление нескольких столбцов из 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, но более опытен с некоторыми другими языками, так что это может быть глупый вопрос.

4b9b3361

Ответ 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 ]