web-dev-qa-db-ja.com

Rのdata.frameから列全体を削除する

誰もがRのdata.frameから列全体を削除する方法を知っていますか?例えば、私がこの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列目を削除します。

238
Nanami

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
374
Joshua Ulrich

(実行時に決定されるのではなく)列名がわかっているときに名前で1つ以上の列を削除するには、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 ) )

dbの間のすべての列を削除することができます。

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

前述したように、この構文は列名がわかっている場合にのみ機能します。列名がプログラムで決定されている(つまり、変数に割り当てられている)と言ってもうまくいきません。この警告は?subsetのドキュメントから再現します。

警告:

これは対話的に使うことを意図した便利な機能です。プログラミングのためには、 '['のような標準的なサブセット化関数を使用するのがより良いです、そして特に引数 'サブセット'の非標準的な評価は予期しない結果をもたらすことができます。

61

(完全を期すために)名前で列を削除したい場合は、次のようにします。

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を含めると、列が1つしか残っていなくても結果はdata.frameになります。

21
ceiling cat

投稿された回答は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

違いを示すために、もっと大きな例をまとめる必要があります。それについては、いつかこの回答を更新します。

20
Chase

これでcolumnを削除してvariableを別のvariableに格納することができます。

df = subset(data, select = -c(genome) )
4
Nirali Khoda

dplyr::select()といくつかのヘルパー関数で1つ以上の列を削除するためのいくつかのオプションがあります。ヘルパー関数は、ドロップする特定の列すべてに名前を付ける必要のないものがあるので便利です。 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
2
sbha