#r #data.table
#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 :=
добавлять новые столбцы для удобства: например: DT[, col := val]
. Итак, чтобы отличить col
само имя от того, что хранится в col
качестве имен столбцов, мы проверяем, является ли LHS name
или an 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]
HTH
Ответ №2:
Я удивлен, что ни в одном предоставленном ответе не используется set()
функция.
set(DT, , colsToDelete, NULL)
Это должно быть проще всего.
Комментарии:
1. две запятые в строке?
2. @wolfsatthedoor Пустой аргумент — это
i
аргумент, который ссылается на строки. Поскольку он опущен, это указывает на то, что все строки должны быть обновлены.
Ответ №3:
Чтобы продолжить предыдущий ответ, вы можете удалить столбцы, выполнив ссылку:
# delete columns 10 to 15
dt[ , (10:15) := NULL ]
или
# delete columns 3, 5 and 10 to 15
dt[ , (c(3,5,10:15)) := NULL ]
Комментарии:
1. чтобы добавить это, вы также можете выполнить dt[ , -(10:15) ] или dt[ , -c(3,5,10:15)]
Ответ №4:
Этот код выполнил работу за меня. вам необходимо указать положение столбцов, подлежащих удалению, например, posvec
как указано в ?set
j: имени (ам) столбца (символ) или числу (ам) (целое число) присваивается значение, когда столбец (ы) уже существует, и только имя (ы) столбца, если они должны быть созданы.
DT_removed_slected_col = set(DT, j = posvec, value = NULL)
Также, если вы хотите получить posvec
, вы можете попробовать это:
selected_col = c('col_a','col_b',...)
selected_col = unlist(sapply(selected_col, function(x) grep(x,names(DT))))
namvec = names(selected_col) #col names
posvec = unname(selected_col) #col positions