Удалить столбцы фрейма данных по имени

avatar
Btibert3
5 января 2011 в 14:34
1696849
24
956

У меня есть несколько столбцов, которые я хотел бы удалить из фрейма данных. Я знаю, что мы можем удалить их по отдельности, используя что-то вроде:

df$x <- NULL

Но я надеялся сделать это с меньшим количеством команд.

Кроме того, я знаю, что могу удалить столбцы, используя целочисленную индексацию, например:

df <- df[ -c(1, 3:6, 12) ]

Но меня беспокоит, что относительное положение моих переменных может измениться.

Учитывая, насколько мощен R, я подумал, что может быть лучший способ, чем отбрасывать каждый столбец один за другим.

Источник
ifly6
20 апреля 2018 в 17:16
23

Может ли кто-нибудь объяснить мне, почему в R нет чего-то простого, например df#drop(var_name), и вместо этого нам нужно выполнить эти сложные обходные пути?

Paul Sochacki
3 сентября 2018 в 08:42
2

@ ifly6 Функция 'subset ()' в R примерно такая же экономная, как функция 'drop ()' в Python, за исключением того, что вам не нужно указывать аргумент оси ... Я согласен, что это раздражает, что нельзя быть всего лишь одним, предельно простым ключевым словом / синтаксисом, реализованным повсеместно для такой простой задачи, как удаление столбца.

Ответы (24)

avatar
Joris Meys
5 января 2011 в 14:40
989

Вы можете использовать простой список имен:

DF <- data.frame(
  x=1:10,
  y=10:1,
  z=rep(5,10),
  a=11:20
)
drops <- c("x","z")
DF[ , !(names(DF) %in% drops)]

Или, в качестве альтернативы, вы можете составить список тех, которые нужно сохранить, и ссылаться на них по имени:

keeps <- c("y", "a")
DF[keeps]

РЕДАКТИРОВАТЬ: Для тех, кто еще не знаком с аргументом drop функции индексации, если вы хотите сохранить один столбец в качестве фрейма данных, сделайте следующее:

keeps <- "y"
DF[ , keeps, drop = FALSE]

drop=TRUE (или без упоминания об этом) удалит ненужные измерения и, следовательно, вернет вектор со значениями столбца y.

mut1na
28 июня 2013 в 09:06
21

функция подмножества работает лучше, поскольку она не преобразует фрейм данных с одним столбцом в вектор

Joris Meys
28 июня 2013 в 10:10
4

@ mut1na проверяет аргумент drop = FALSE функции индексации.

lindelof
28 октября 2014 в 13:53
6

Разве это не должно быть DF[,keeps] вместо DF[keeps]?

Joris Meys
28 октября 2014 в 19:05
8

@lindelof Нет. Может, но тогда вам нужно добавить drop = FALSE, чтобы R не преобразовывал ваш фрейм данных в вектор, если вы выбираете только один столбец. Не забывайте, что фреймы данных - это списки, поэтому выбор списка (одномерный, как я) работает отлично и всегда возвращает список. Или в данном случае фрейм данных, поэтому я предпочитаю его использовать.

Joris Meys
7 июля 2015 в 13:55
7

@AjayOhri Да, было бы. Без запятой вы используете способ выбора «список», что означает, что даже когда вы извлекаете один столбец, вы все равно получаете возвращаемый фрейм данных. Если вы используете «матричный» способ, как и вы, вы должны знать, что если вы выберете только один столбец, вы получите вектор вместо фрейма данных. Чтобы этого избежать, нужно добавить drop = FALSE. Как объясняется в моем ответе и в комментарии прямо над вашим ...

J. Mini
19 марта 2021 в 21:56
0

Почему бы не использовать DF[!(names(DF) %in% drops)]? Судя по тому, что было сказано в этих комментариях, это должно быть эквивалентно использованию drop=FALSE, что, вероятно, и так нам нужно.

avatar
Rafa
29 ноября 2021 в 21:44
0
df <- data.frame(
+   a=1:5,
+   b=6:10,
+   c=rep(22,5),
+   d=round(runif(5)*100, 2),
+   e=round(runif(5)*100, 2),
+   f=round(runif(5)*100, 2),
+   g=round(runif(5)*100, 2),
+   h=round(runif(5)*100, 2)
+ )
> df
  a  b  c     d     e     f     g     h
1 1  6 22 76.31 39.96 66.62 72.75 73.14
2 2  7 22 53.41 94.85 96.02 97.31 85.32
3 3  8 22 98.29 38.95 12.61 29.67 88.45
4 4  9 22 20.04 53.53 83.07 77.50 94.99
5 5 10 22  5.67  0.42 15.07 59.75 31.21

> # remove cols: d g h
> newDf <- df[, c(1:3, 5), drop=TRUE]
> newDf
  a  b  c     e
1 1  6 22 39.96
2 2  7 22 94.85
3 3  8 22 38.95
4 4  9 22 53.53
5 5 10 22  0.42
avatar
Rupesh Kumar
2 ноября 2021 в 19:03
2

Отбрасывать и удалять столбцы по имени столбца во фрейме данных.

A <- df[ , c("Name","Name1","Name2","Name3")]
avatar
Md. Sahidul Islam
24 октября 2021 в 06:44
0

Есть много способов сделать ...

Вариант-1:

df[ , -which(names(df) %in% c("name1","name2"))]

Вариант 2:

df[!names(df) %in% c("name1", "name2")]

Вариант 3:

subset(df, select=-c(name1,name2))
avatar
andschar
12 августа 2021 в 10:27
0

Другой параметр data.table , который еще не был опубликован, использует специальный глагол .SD, который обозначает подмножество данных. Вместе с аргументом .SDcols вы можете выбирать / удалять столбцы по имени или индексу.

require(data.table)
# data
dt = data.table(
  A = LETTERS[1:5],
  B = 1:5,
  C = rep(TRUE, 5)
)
# delete B
dt[ , .SD, .SDcols =! 'B' ]
# delete all matches (i.e. all columns)
cols = grep('[A-Z]+', names(dt), value = TRUE)
dt[ , .SD, .SDcols =! cols ]

Сводку всех параметров для такой задачи в таблице данных можно найти здесь

avatar
GKi
16 декабря 2019 в 11:56
1

Если у вас большой data.frame и мало памяти, используйте [. . . . или rm и в пределах до удалите столбцы data.frame , поскольку subset в настоящее время (R 3.6.2) использует больше памяти - помимо подсказки руководства для использовать subset в интерактивном режиме .

getData <- function() {
  n <- 1e7
  set.seed(7)
  data.frame(a = runif(n), b = runif(n), c = runif(n), d = runif(n))
}

DF <- getData()
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
DF <- DF[setdiff(names(DF), c("a", "c"))] ##
#DF <- DF[!(names(DF) %in% c("a", "c"))] #Alternative
#DF <- DF[-match(c("a","c"),names(DF))]  #Alternative
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#0.1 MB are used

DF <- getData()
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
DF <- subset(DF, select = -c(a, c)) ##
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#357 MB are used

DF <- getData()
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
DF <- within(DF, rm(a, c)) ##
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#0.1 MB are used

DF <- getData()
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
DF[c("a", "c")]  <- NULL ##
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#0.1 MB are used
avatar
milan
3 августа 2018 в 17:44
1

Найдите индекс столбцов, которые вы хотите удалить, используя which. Присвойте этим индексам отрицательный знак (*-1). Затем подмножество этих значений, которое удалит их из фрейма данных. Это пример.

DF <- data.frame(one=c('a','b'), two=c('c', 'd'), three=c('e', 'f'), four=c('g', 'h'))
DF
#  one two three four
#1   a   d     f    i
#2   b   e     g    j

DF[which(names(DF) %in% c('two','three')) *-1]
#  one four
#1   a    g
#2   b    h
avatar
sbha
2 июля 2018 в 21:34
8

Помимо select(-one_of(drop_col_names)), продемонстрированного в предыдущих ответах, существует еще пара других dplyr вариантов удаления столбцов с использованием select(), которые не включают определение всех конкретных имен столбцов (с использованием образцов данных dplyr starwars для некоторого разнообразия в столбцах имена):

library(dplyr)
starwars %>% 
  select(-(name:mass)) %>%        # the range of columns from 'name' to 'mass'
  select(-contains('color')) %>%  # any column name that contains 'color'
  select(-starts_with('bi')) %>%  # any column name that starts with 'bi'
  select(-ends_with('er')) %>%    # any column name that ends with 'er'
  select(-matches('^f.+s$')) %>%  # any column name matching the regex pattern
  select_if(~!is.list(.)) %>%     # not by column name but by data type
  head(2)

# A tibble: 2 x 2
homeworld species
  <chr>     <chr>  
1 Tatooine  Human  
2 Tatooine  Droid 

Если вам нужно отбросить столбец, который может существовать или не существовать во фрейме данных, вот небольшой поворот с использованием select_if(), который, в отличие от использования one_of(), не выдаст предупреждение Unknown columns:, если имя столбца не существует . В этом примере bad_column не является столбцом во фрейме данных:

starwars %>% 
  select_if(!names(.) %in% c('height', 'mass', 'bad_column'))
avatar
Cybernetic
15 июня 2018 в 16:51
4

Предоставьте кадр данных и строку разделенных запятыми имен для удаления:

remove_features <- function(df, features) {
  rem_vec <- unlist(strsplit(features, ', '))
  res <- df[,!(names(df) %in% rem_vec)]
  return(res)
}

Использование :

remove_features(iris, "Sepal.Length, Petal.Width")

enter image description here

avatar
Preston
31 января 2018 в 11:46
31

Решение Dplyr

Я сомневаюсь, что здесь будет много внимания, но если у вас есть список столбцов, которые вы хотите удалить, и вы хотите сделать это в цепочке dplyr, я использую one_of() в предложении select :

Вот простой воспроизводимый пример:

undesired <- c('mpg', 'cyl', 'hp')

mtcars <- mtcars %>%
  select(-one_of(undesired))

Документацию можно найти, запустив ?one_of или здесь:

http://genomicsclass.github.io/book/pages/dplyr_tutorial.html

avatar
Nick Keramaris
25 октября 2016 в 22:57
9

Другое решение, если вы не хотите использовать указанное выше @ hadley: если "COLUMN_NAME" - это имя столбца, который вы хотите удалить:

df[,-which(names(df) == "COLUMN_NAME")]
Marek
23 ноября 2016 в 11:34
1

(1) Проблема в том, чтобы удалить сразу несколько столбцов. (2) Это не сработает, если COLUMN_NAME не находится в df (проверьте себя: df<-data.frame(a=1,b=2)). (3) df[,names(df) != "COLUMN_NAME"] проще и не страдает от (2)

Akash Nayak
17 января 2018 в 13:04
0

Не могли бы вы дать дополнительную информацию об этом ответе?

avatar
krlmlr
4 декабря 2014 в 14:06
12

В пакете Бернд Бишл BBmisc есть функция с именем dropNamed(), которая делает именно это.

BBmisc::dropNamed(df, "x")

Преимущество состоит в том, что он позволяет избежать повторения аргумента кадра данных и, таким образом, подходит для конвейерной передачи в magrittr (точно так же, как подходы dplyr):

df %>% BBmisc::dropNamed("x")

avatar
Pat W.
22 ноября 2014 в 20:37
35

Другой dplyr ответ. Используйте select(-column).

Если ваши переменные имеют общую структуру именования, вы можете попробовать starts_with(). Например,

library(dplyr)
df <- data.frame(var1 = rnorm(5), var2 = rnorm(5), var3 = rnorm (5), 
                 var4 = rnorm(5), char1 = rnorm(5), char2 = rnorm(5))
df
#        var2      char1        var4       var3       char2       var1
#1 -0.4629512 -0.3595079 -0.04763169  0.6398194  0.70996579 0.75879754
#2  0.5489027  0.1572841 -1.65313658 -1.3228020 -1.42785427 0.31168919
#3 -0.1707694 -0.9036500  0.47583030 -0.6636173  0.02116066 0.03983268

df1 <- df %>% select(-starts_with("char"))

df1
#        var2        var4       var3       var1
#1 -0.4629512 -0.04763169  0.6398194 0.75879754
#2  0.5489027 -1.65313658 -1.3228020 0.31168919
#3 -0.1707694  0.47583030 -0.6636173 0.03983268

Если вы хотите удалить последовательность переменных во фрейме данных, вы можете использовать :. Например, если вы хотите удалить var2, var3 и все переменные между ними, вы просто останетесь с var1:

df2 <- df1 %>% select(-c(var2:var3) )  
df2
#        var1
#1 0.75879754
#2 0.31168919
#3 0.03983268
ha-pu
1 марта 2019 в 17:31
2

Не забывайте обо всех других возможностях, которые предоставляются с select(), например, contains() или matches(), который также принимает регулярное выражение.

avatar
c.gutierrez
27 августа 2014 в 17:01
19

Вот способ dplyr сделать это:

#df[ -c(1,3:6, 12) ]  # original
df.cut <- df %>% select(-col.to.drop.1, -col.to.drop.2, ...  -col.to.drop.6)  # with dplyr::select()

Мне это нравится, потому что он интуитивно понятен для чтения и понимания без аннотаций и устойчив к изменению положения столбцов во фрейме данных. Он также следует векторизованной идиоме с использованием - для удаления элементов.

Marek
23 ноября 2016 в 11:39
0

Добавив к этому, что (1) пользователь хочет заменить исходный df (2) magrittr имеет оператор %<>% для замены входного объекта, его можно упростить до df %<>% select(-col.to.drop.1, -col.to.drop.2, ... -col.to.drop.6)

iNyar
4 мая 2017 в 06:32
1

Если у вас есть длинный список столбцов, которые нужно удалить, с dplyr, может быть проще сгруппировать их и поставить только один минус: df.cut <- df %>% select(-c(col.to.drop.1, col.to.drop.2, ... col.to.drop.n))

avatar
Kun Ren
20 июня 2014 в 00:27
23
DF <- data.frame(
  x=1:10,
  y=10:1,
  z=rep(5,10),
  a=11:20
)
DF

Вывод:

    x  y z  a
1   1 10 5 11
2   2  9 5 12
3   3  8 5 13
4   4  7 5 14
5   5  6 5 15
6   6  5 5 16
7   7  4 5 17
8   8  3 5 18
9   9  2 5 19
10 10  1 5 20

DF[c("a","x")] <- list(NULL)

Вывод:

        y z
    1  10 5
    2   9 5
    3   8 5
    4   7 5
    5   6 5
    6   5 5
    7   4 5
    8   3 5    
    9   2 5
    10  1 5
avatar
Vincent
12 февраля 2014 в 05:34
60

список (NULL) также работает:

dat <- mtcars
colnames(dat)
# [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
# [11] "carb"
dat[,c("mpg","cyl","wt")] <- list(NULL)
colnames(dat)
# [1] "disp" "hp"   "drat" "qsec" "vs"   "am"   "gear" "carb"
c-urchin
20 мая 2014 в 16:15
1

Блестяще! Это естественным образом расширяет назначение NULL до одного столбца и (по-видимому) позволяет избежать копирования (хотя я не знаю, что происходит под капотом, поэтому он может быть не более эффективным в использовании памяти ... но мне кажется ясно синтаксически более эффективен.)

CousinCocaine
7 июля 2014 в 08:29
6

Вам не нужен список (NULL), достаточно NULL. например: dat [, 4] = NULL

Vincent
16 сентября 2014 в 00:01
9

Вопрос OP заключался в том, как удалить несколько столбцов. dat [, 4: 5] <- NULL работать не будет. Вот тут-то и появляется список (NULL). Он работает для 1 или более столбцов.

MichaelChirico
15 июля 2016 в 19:58
0

Это также не работает при попытке удалить повторяющееся имя столбца.

Vincent
15 июля 2016 в 22:47
0

@MichaelChirico У меня отлично работает. Либо укажите метку, если вы хотите удалить первый столбец с тем же именем, либо укажите индексы для каждого столбца, который вы хотите удалить. Если у вас есть пример, когда это не работает, мне было бы интересно его увидеть. Возможно, разместите это как новый вопрос?

Bear
20 ноября 2018 в 20:03
0

Этот синтаксис также будет работать для data.table. dat[,c("mpg","cyl","wt")] <- NULL

avatar
Max Ghenis
28 сентября 2013 в 22:28
234
within(df, rm(x))

, вероятно, самый простой вариант или для нескольких переменных:

within(df, rm(x, y))

Или, если вы имеете дело с data.table (для Как удалить столбец по имени в таблице data.table?):

dt[, x := NULL]   # Deletes column x by reference instantly.

dt[, !"x"]   # Selects all but x into a new data.table.

или для нескольких переменных

dt[, c("x","y") := NULL]

dt[, !c("x", "y")]
Miles Erickson
2 октября 2015 в 01:00
36

within(df, rm(x)) - это , безусловно, самое чистое решение. Учитывая, что это возможно, любой другой ответ кажется излишне сложным на порядок.

MichaelChirico
15 июля 2016 в 19:51
2

Обратите внимание, что within(df, rm(x)) не будет работать, если есть повторяющиеся столбцы с именем x в df.

Max Ghenis
10 марта 2017 в 22:23
2

@MichaelChirico, чтобы уточнить, он ничего не удаляет, но, похоже, меняет значения данных. В этом случае возникают более серьезные проблемы, но вот пример: df <- data.frame(x = 1, y = 2); names(df) <- c("x", "x"); within(df, rm(x)) возвращает data.frame(x = 2, x = 2).

Joris Meys
13 декабря 2018 в 13:45
1

@MilesErickson Проблема в том, что вы полагаетесь на функцию within(), которая является мощной, но также использует NSE. В примечании на странице справки четко указано, что при программировании следует проявлять достаточную осторожность.

HSchmale
3 января 2019 в 19:26
0

@MilesErickson Как часто можно встретить фрейм данных с повторяющимися именами в нем?

J. Mini
18 марта 2021 в 01:43
0

@HSchmale df<-data.frame(x=1:3,y=4:6,x=7:9) является допустимым, но последний столбец становится x.1. Я видел только повторяющиеся имена в списках. Чтобы получить его во фрейме данных, вам необходимо передать аргумент check.names = FALSE.

J. Mini
4 апреля 2021 в 20:09
0

Два других основных преимущества within: вам не нужно передавать аргумент drop=FALSE, и rm предупредит вас, если столбец, который вы пытаетесь удалить, отсутствует. [ не такой добрый.

avatar
jkeirstead
2 мая 2013 в 18:42
22

Ради интереса это указывает на одну из странных множественных несоответствий синтаксиса R. Например, для фрейма данных с двумя столбцами:

df <- data.frame(x=1, y=2)

Это дает кадр данных

subset(df, select=-y)

, но это дает вектор

df[,-2]

Все это объясняется в ?[, но это не совсем ожидаемое поведение. По крайней мере, для меня ...

avatar
mnel
14 ноября 2012 в 01:02
45

Если вы хотите удалить столбцы по ссылке и избежать внутреннего копирования, связанного с 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)
avatar
scentoni
10 января 2012 в 23:17
26

Другая возможность:

df <- df[, setdiff(names(df), c("a", "c"))]

или

df <- df[, grep('^(a|c)$', names(df), invert=TRUE)]
ctbrown
25 марта 2014 в 21:42
2

Жаль, что за это не набирают больше голосов, потому что использование setdiff является оптимальным, особенно в случае очень большого количества столбцов.

Joe
21 апреля 2016 в 09:44
0

Другой ракурс на это: df <- df[ , -which(grepl('a|c', names(df)))]

avatar
IRTFM
5 января 2011 в 21:50
42

Существует потенциально более мощная стратегия, основанная на том факте, что grep () вернет числовой вектор. Если у вас есть длинный список переменных, как у меня в одном из моих наборов данных, некоторые переменные заканчиваются на ".A", а другие заканчиваются на ".B", и вам нужны только те, которые заканчиваются на ".A" (вместе со всеми переменными, которые не соответствуют ни одному из шаблонов, сделайте следующее:

dfrm2 <- dfrm[ , -grep("\\.B$", names(dfrm)) ]

В данном случае, используя пример Джориса Мейса, он может быть не таким компактным, но это будет:

DF <- DF[, -grep( paste("^",drops,"$", sep="", collapse="|"), names(DF) )]
MichaelChirico
13 апреля 2016 в 20:31
1

Если мы определим drops в первую очередь как paste0("^", drop_cols, "$"), это станет намного лучше (читай: более компактным) с sapply: DF[ , -sapply(drops, grep, names(DF))]

avatar
JD Long
5 января 2011 в 17:21
14

Я все время думаю, что должна быть лучшая идиома, но для вычитания столбцов по имени я обычно делаю следующее:

df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)

# return everything except a and c
df <- df[,-match(c("a","c"),names(df))]
df
hadley
5 января 2011 в 18:33
4

Не рекомендуется отрицать совпадение - df[,-match(c("e","f"),names(df))]

Chetan Arvind Patil
22 января 2019 в 18:04
0

. @ JDLong - Что, если я хочу удалить столбец, имя которого начинается с -?

avatar
Prasad Chalasani
5 января 2011 в 14:52
494

Также есть команда subset, полезная, если вы знаете, какие столбцы вам нужны:

df <- data.frame(a = 1:10, b = 2:11, c = 3:12)
df <- subset(df, select = c(a, c))

ОБНОВЛЕНО после комментария @hadley: Чтобы удалить столбцы a, c, вы можете сделать:

df <- subset(df, select = -c(a, c))
Prasad Chalasani
5 января 2011 в 14:56
3

Мне действительно хотелось бы, чтобы у функции R subset была опция типа «allbut = FALSE», которая «инвертирует» выбор при установке на TRUE, то есть сохраняет все столбцы , кроме тех, что в списке select.

JD Long
5 января 2011 в 15:16
4

@prasad, см. ответ @joris ниже. Подмножество без каких-либо критериев подмножества - это немного излишне. Попробуйте просто: df[c("a", "c")]

Prasad Chalasani
5 января 2011 в 15:18
0

@JD Я знал об этом, но мне нравится синтаксическое удобство команды subset, когда вам не нужно заключать в кавычки имена столбцов - я думаю, я не возражаю ввести несколько дополнительных символов, чтобы избежать цитирования имен :)

JD Long
5 января 2011 в 15:24
0

о, это хороший момент. Я не думал о цитате.

Ari B. Friedman
3 октября 2012 в 14:42
13

Обратите внимание, что вы не должны использовать subset внутри других функций.

Ari B. Friedman
30 сентября 2013 в 18:33
2

@mac coderhelper.com/questions/12850141/…

Puriney
26 апреля 2019 в 19:24
0

подмножество (df, select = -c (b)) @spacetyper

Tom
30 июля 2020 в 08:04
0

Я использовал это, но теперь получаю сообщение об ошибке: Error: unexpected '=' in "DT <- subset(DT, select=" Что-то изменилось?

avatar
Joshua Ulrich
5 января 2011 в 14:40
128

Вы можете использовать %in% так:

df[, !(colnames(df) %in% c("x","bar","foo"))]
Daniel Fletcher
28 апреля 2016 в 05:46
1

Я что-то упустил, или это фактически то же самое решение, что и первая часть ответа Джориса? DF[ , !(names(DF) %in% drops)]

Joshua Ulrich
28 апреля 2016 в 13:01
11

@DanielFletcher: это то же самое. Посмотрите на отметки времени в ответах. Мы ответили одновременно ... 5 лет назад. :)

Daniel Fletcher
30 апреля 2016 в 02:47
6

Чокнутый. identical(post_time_1, post_time_2) [1] TRUE = D

J. Mini
19 марта 2021 в 22:19
0

Почему бы не опустить запятую? Я не вижу причин, по которым df[!(colnames(df) %in% c("x","bar","foo"))] не был бы эквивалентен.

Amer
7 июля 2021 в 00:48
0

почему он возвращает вектор FALSE / TRUE, когда я запускаю фрейм данных data.table. Почему?