982

データ フレームから削除したい列がいくつかあります。次のようなものを使用して、それらを個別に削除できることを知っています。

df$x <- NULL

しかし、私はより少ないコマンドでこれを行うことを望んでいました。

また、次のような整数インデックスを使用して列を削除できることも知っています。

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

しかし、変数の相対的な位置が変わるのではないかと心配しています。

R がいかに強力であるかを考えると、各列を 1 つずつ削除するよりも良い方法があるのではないかと考えました。

4

24 に答える 24

1006

名前の単純なリストを使用できます。

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]

EDIT:インデックス関数の引数にまだ慣れていないdrop人のために、1つの列をデータフレームとして保持したい場合は、次のようにします:

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

drop=TRUE(または言及しない)不要な次元を削除するため、 column の値を持つベクトルを返しますy

于 2011-01-05T14:40:25.807 に答える
504

必要な列がわかっている場合に役立つコマンドもあり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))
于 2011-01-05T14:52:40.727 に答える
240
within(df, rm(x))

おそらく最も簡単な、または複数の変数の場合:

within(df, rm(x, y))

data.tableまたは、 sを扱っている場合( 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")]
于 2013-09-28T22:28:56.747 に答える
130

%in%次のように使用できます。

df[, !(colnames(df) %in% c("x","bar","foo"))]
于 2011-01-05T14:40:26.917 に答える
61

list(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"
于 2014-02-12T05:34:52.497 に答える
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.tabledata.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)
于 2012-11-14T01:02:41.563 に答える
44

grep()が数値ベクトルを返すという事実に基づいて、潜在的により強力な戦略があります。私のデータセットの1つにあるように、変数の長いリストがある場合、「。A」で終わる変数と「.B」で終わる変数があり、「。A」で終わる変数のみが必要です。どちらのパターンにも一致しないすべての変数を使用して、次のようにします。

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

手元のケースでは、Joris Meysの例を使用すると、それほどコンパクトではない可能性がありますが、次のようになります。

DF <- DF[, -grep( paste("^",drops,"$", sep="", collapse="|"), names(DF) )]
于 2011-01-05T21:50:03.730 に答える
37

別の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
于 2014-11-22T20:37:02.827 に答える
32

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

于 2018-01-31T11:46:06.723 に答える
26

別の可能性:

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

また

df <- df[, grep('^(a|c)$', names(df), invert=TRUE)]
于 2012-01-10T23:17:34.093 に答える
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
于 2014-06-20T00:27:53.453 に答える
22

興味深いことに、これは R の奇妙な複数構文の矛盾の 1 つにフラグを立てます。たとえば、2 列のデータ フレームがあるとします。

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

これにより、データフレームが得られます

subset(df, select=-y)

しかし、これはベクトルを与えます

df[,-2]

これはすべて で説明されて?[いますが、正確に期待される動作ではありません。少なくとも私にはそうではありません...

于 2013-05-02T18:42:27.023 に答える
15

より良いイディオムがあるに違いないと考え続けていますが、名前による列の減算では、次のようにする傾向があります。

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
于 2011-01-05T17:21:58.217 に答える
9

上記の @hadley を使用したくない場合の別の解決策: 「COLUMN_NAME」が削除する列の名前である場合:

df[,-which(names(df) == "COLUMN_NAME")]
于 2016-10-25T22:57:20.200 に答える
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")

ここに画像の説明を入力

于 2018-06-15T16:51:02.373 に答える
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
于 2021-11-29T21:44:22.160 に答える