Видаліть цілий стовпець із фрейму data.frame в R


267

Хтось знає, як видалити цілий стовпець із data.frame в R? Наприклад, якщо мені надано цей data.frame:

> head(data)
   chr       genome region
1 chr1 hg19_refGene    CDS
2 chr1 hg19_refGene   exon
3 chr1 hg19_refGene    CDS
4 chr1 hg19_refGene   exon
5 chr1 hg19_refGene    CDS
6 chr1 hg19_refGene   exon

і я хочу видалити 2-й стовпчик.


1
Можливий дублікат стовпців Drop в кадрі даних R
jangorecki

Відповіді:


414

Ви можете встановити його NULL.

> Data$genome <- NULL
> head(Data)
   chr region
1 chr1    CDS
2 chr1   exon
3 chr1    CDS
4 chr1   exon
5 chr1    CDS
6 chr1   exon

Як зазначалося в коментарях, ось деякі інші можливості:

Data[2] <- NULL    # Wojciech Sobala
Data[[2]] <- NULL  # same as above
Data <- Data[,-2]  # Ian Fellows
Data <- Data[-2]   # same as above

Ви можете видалити кілька стовпців за допомогою:

Data[1:2] <- list(NULL)  # Marek
Data[1:2] <- NULL        # does not work!

Будьте обережні з матрицею, що підмножує, оскільки ви можете закінчити вектор:

Data <- Data[,-(2:3)]             # vector
Data <- Data[,-(2:3),drop=FALSE]  # still a data.frame

48
або ви можете використовувати: Дані <- Дані [, - 2]
Ian Fellows

2
з комою ви також можете керувати аргументом "drop", який, коли FALSE означає, що data.frame залишається data.frame, коли результат складається лише з одного стовпця - без коми ви завжди отримаєте data.frame, чи є кілька стовпців зліва або лише одна крапля ігнорується для видобутку [-2]
mdsumner

3
@mdsumner Data[-2]не потрібен dropаргумент, тому що він завжди повертається data.frameз data.frame. І я думаю, що це набагато кращий спосіб локалізувати стовпці (і лише стовпці) в data.frame(і це швидше). Перевірка: cars[-1](один стовпець data.frame) або краще cars[-(1:2)]: data frame with 0 columns and 50 rows.
Марек

1
Ви також можете записати дані [2] <- NULL
Войцех Собала

11
Незначна підказка: Коли потрібно видалити кілька стовпців Data[c(1,2)]<-list(NULL).
Марек

69

Щоб видалити один або кілька стовпців за назвою, коли імена стовпців відомі (на відміну від визначення під час виконання), мені подобається subset()синтаксис. Напр. Для фрейму даних

df <- data.frame(a=1:3, d=2:4, c=3:5, b=4:6)

щоб видалити лише aстовпець, який ви могли зробити

Data <- subset( Data, select = -a )

і видалити стовпці bта dстовпці, які ви могли зробити

Data <- subset( Data, select = -c(d, b ) )

Ви можете видалити всі стовпці між dі за bдопомогою:

Data <- subset( Data, select = -c( d : b )

Як я вже говорив вище, цей синтаксис працює лише тоді, коли відомі назви стовпців. Він не працюватиме, коли скажіть, що назви стовпців визначені програмно (тобто присвоєні змінній). Я повторю це Попередження з ?subsetдокументації:

Увага:

Це функція зручності, призначена для інтерактивного використання. Для програмування краще використовувати стандартні функції підмножини, такі як "[", і, зокрема, нестандартна оцінка аргументу "підмножина" може мати непередбачувані наслідки.


26

(Для повноти) Якщо ви хочете видалити стовпці за назвою, ви можете зробити це:

cols.dont.want <- "genome"
cols.dont.want <- c("genome", "region") # if you want to remove multiple columns

data <- data[, ! names(data) %in% cols.dont.want, drop = F]

У тому числі drop = Fгарантує, що результат буде data.frameрівним, якщо залишиться лише один стовпець.


22

Опубліковані відповіді дуже хороші при роботі з data.frames. Однак з точки зору пам'яті ці завдання можуть бути досить неефективними. З великими даними видалення стовпця може зайняти незвично довгий час та / або вийти з ладу через out of memoryпомилки. Пакет data.tableдопомагає вирішити цю проблему з :=оператором:

library(data.table)
> dt <- data.table(a = 1, b = 1, c = 1)
> dt[,a:=NULL]
     b c
[1,] 1 1

Я повинен зібрати більший приклад, щоб показати відмінності. Я оновлю цю відповідь у якийсь момент із цим.


3
data.table::setФункція може бути використана на data.frameз , щоб видалити або змінити стовпець миттєво, без копіювання. Дивіться тут
GSee

8

Існує кілька варіантів для видалення однієї або декількох стовпців із dplyr::select()деякими допоміжними функціями. Допоміжні функції можуть бути корисними, оскільки для деяких не потрібно називати всі конкретні стовпці, які потрібно скидати. Зауважте, що для викидання стовпців select()вам потрібно використовувати ведучий -для відміни імен стовпців.

Використання dplyr::starwarsзразкових даних для деякої різноманітності в назвах стовпців:

library(dplyr)

starwars %>% 
  select(-height) %>%                  # a specific column name
  select(-one_of('mass', 'films')) %>% # any columns named in one_of()
  select(-(name:hair_color)) %>%       # the range of columns from 'name' to 'hair_color'
  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('^v.+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 

Ви також можете перейти за номером стовпця:

starwars %>% 
  select(-2, -(4:10)) # column 2 and columns 4 through 10

Чудова відповідь. Будь-яка ідея про те, як скинути стовпчик, який містить певне значення в будь-якому з його рядків (а не в назві його стовпця, як ви запропонували вище)?
Лаура К

df [, - котрий (sapply (df, function (x) будь-який (x == a)))]], де df - ваш кадр даних, а a - ваше конкретне значення, наприклад: mtcars [, - котрий (sapply (mtcars, функція (х) будь-(х == 4)))]
Нанами

7

За допомогою цього ви можете видалити columnта зберігати variableв іншому variable.

df = subset(data, select = -c(genome) )
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.