web-dev-qa-db-ja.com

名前による列の選択解除

特定の名前を持つ列を除いて、データフレームのすべての列を選択する方法はありますか?.

インデックスの代わりに列名を使用することを除いて、df[, -1]に類似していますか?

29
Alex

これは、ベクトルサブセットを使用して行うことができます。まず、ダミーデータセットを作成します。

R> dd = data.frame(A = 1:3, B = 1:3, C=1:3, D=1:3)

次に、!演算子を使用して、選択を逆にします。

R> dd[ ,!(colnames(dd) == "A")]

  B C D
1 1 1 1
2 2 2 2
3 3 3 3

または、次のようにすることもできます。

  • 少し短いバージョン(@Tomas提供):

    dd[ , names(dd) != "A"]
    
  • 複数の列に対処するには(@Tylerの厚意による)

    dd[ ,!(colnames(dd) %in% c("A", "B"))]
    
51
csgillespie

subset関数は、ヘルプページの例から、このタイプの構文を既に許可しています。

subset(airquality, Day == 1, select = -Temp)
8
Greg Snow

which()関数を使用して、削除する列を識別できます。

_dd <- data.frame(A = 1:5, B = 1:5, C=1:5)

dd[, -which(names(dd) == "A")]
_

または積極的に

_dd[, which(names(dd) != "A")]
_

ただし、「A」という名前の列がない場合は、0列とnrow(dd)行のデータフレームが表示されます。したがって、「A」という名前の列の存在を確認することをお勧めします。

_if(any(names(dd) == "A")) {
  dd[, which(names(dd) != "A")]
}
_
8
BenBarnes

複数の列の選択を解除するには、dplyrパッケージを使用できます。例として:

dd = data.frame(A = 1:3, B = 1:3, C=1:3, D=1:3)

library(dplyr)
newdd <- select(dd, -A,-C)

これは、@ csgillespieが示唆した以外の方法です。

3
mojimoji

AとCを削除

baseソリューション

df <- data.frame(A = 1:3, B = 1:3, C=1:3, D=1:3)

df[,c("A","C")]<-NULL

data.table 解決

dt <- data.table(A = 1:3, B = 1:3, C=1:3, D=1:3)

#    A B C D
# 1: 1 1 1 1
# 2: 2 2 2 2
# 3: 3 3 3 3

dt[,c("A","C"):=NULL]

#   B D
#1: 1 1
#2: 2 2
#3: 3 3
2
Andre Elrico