Если вы хотите удалить столбцы по ссылке и избежать внутреннего копирования, связанного с data.frames
, вы можете использовать пакет data.table
и функцию :=
Вы можете передать имена векторов символов в левую часть оператора :=
и NULL
как RHS.
library(data.table)
df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)
DT <- data.table(df)
# or more simply DT <- data.table(a=1:10, b=1:10, c=1:10, d=1:10) #
DT[, c('a','b') := NULL]
Если вы хотите заранее определить имена как вектор символов вне вызова в [
, оберните имя объекта в ()
или {}
, чтобы заставить LHS оцениваться в области вызова, а не как имя в рамках DT
.
del <- c('a','b')
DT <- data.table(a=1:10, b=1:10, c=1:10, d=1:10)
DT[, (del) := NULL]
DT <- <- data.table(a=1:10, b=1:10, c=1:10, d=1:10)
DT[, {del} := NULL]
# force or `c` would also work.
Вы также можете использовать set
, что позволяет избежать накладных расходов на [.data.table
, , а также работает для data.frames
!
df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)
DT <- data.table(df)
# drop `a` from df (no copying involved)
set(df, j = 'a', value = NULL)
# drop `b` from DT (no copying involved)
set(DT, j = 'b', value = NULL)
Может ли кто-нибудь объяснить мне, почему в R нет чего-то простого, например
df#drop(var_name)
, и вместо этого нам нужно выполнить эти сложные обходные пути?@ ifly6 Функция 'subset ()' в R примерно такая же экономная, как функция 'drop ()' в Python, за исключением того, что вам не нужно указывать аргумент оси ... Я согласен, что это раздражает, что нельзя быть всего лишь одним, предельно простым ключевым словом / синтаксисом, реализованным повсеместно для такой простой задачи, как удаление столбца.