誰もが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列目を削除します。
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
(実行時に決定されるのではなく)列名がわかっているときに名前で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 ) )
d
とb
の間のすべての列を削除することができます。
Data <- subset( Data, select = -c( d : b )
前述したように、この構文は列名がわかっている場合にのみ機能します。列名がプログラムで決定されている(つまり、変数に割り当てられている)と言ってもうまくいきません。この警告は?subset
のドキュメントから再現します。
警告:
これは対話的に使うことを意図した便利な機能です。プログラミングのためには、 '['のような標準的なサブセット化関数を使用するのがより良いです、そして特に引数 'サブセット'の非標準的な評価は予期しない結果をもたらすことができます。
(完全を期すために)名前で列を削除したい場合は、次のようにします。
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
になります。
投稿された回答はdata.frame
sを扱うときにとても良いです。ただし、これらのタスクはメモリの観点から見るとかなり非効率的です。大きなデータの場合、列を削除すると異常に長い時間がかかる、または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
違いを示すために、もっと大きな例をまとめる必要があります。それについては、いつかこの回答を更新します。
これでcolumn
を削除してvariable
を別のvariable
に格納することができます。
df = subset(data, select = -c(genome) )
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