Удаление нескольких столбцов из R data.таблица с параметром для удаляемых столбцов

#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