web-dev-qa-db-ja.com

data.frameから列を削除するにはどうすればよいですか?

「どうですか...?」しかし、もっと「お元気ですか...」

誰かが200カラムを与えてくれたファイルがあり、それを分析に必要ないくつかのカラムに減らしたい場合、どうすればいいですか?あるソリューションは別のソリューションよりも利点がありますか?

列col1、col2からcol200のデータフレームがあると仮定します。 1から100までしか必要とせず、125から135までと150から200までしか必要ない場合は、次のようにします。

dat$col101 <- NULL
dat$col102 <- NULL # etc

または

dat <- dat[,c("col1","col2",...)]

または

dat <- dat[,c(1:100,125:135,...)] # shortest probably but I don't like this

または

dat <- dat[,!names(dat) %in% c("dat101","dat102",...)]

私が不足しているものはありますか?これは見た目が主観的であることを知っていますが、それはあなたが飛び込んで一方向にそれを始め、はるかに効率的な方法があるときに習慣に陥る可能性のある重要なザラザラしたものの1つです。 which についてのこの質問とよく似ています。

編集:

または、列名の実用的なベクトルを作成する簡単な方法はありますか? name(dat)は、上記のコード例で必要なカンマを使用してそれらを出力しません。したがって、そのように名前を出力すると、どこにでもスペースがあり、手動でカンマを入力する必要があります...出力として "col1"、 "col2"、 "col3"、...を提供するコマンドで、必要なものを簡単に取得できますか?

37
nzcoops

data.table:=演算子を使用して、テーブルのサイズに関係なく列を即座に削除します。

DT[, coltodelete := NULL]

または

DT[, c("col1","col20") := NULL]

または

DT[, (125:135) := NULL]

または

DT[, (variableHoldingNamesOrNumbers) := NULL]

<-またはsubsetを使用するソリューションは、wholeテーブルをコピーします。 data.table:=演算子は、列へのポインターの内部ベクトルを適切に変更するだけです。したがって、その操作は(ほぼ)瞬時です。

54
Matt Dowle

単一の列を削除するには、dat$x <- NULL

複数の列を削除するが、約3〜4未満の場合は、dat$x <- dat$y <- dat$z <- NULL

それ以上の場合、subsetを使用して、負の名前(!)を付けます。

subset(mtcars, , -c(mpg, cyl, disp, hp))
31
Hong Ooi

わかりやすくするために、subsetでselect引数をよく使用します。新しい人たちと、私は彼らが必要とするコマンドの数を最小限に抑えることは採用に役立つことを学びました。スキルが向上するにつれて、コーディング能力も向上します。また、サブセットは、特定の条件内でデータを選択する必要があるときに表示する最初のコマンドの1つです。

何かのようなもの:

> subset(mtcars, select = c("mpg", "cyl", "vs", "am"))
                     mpg cyl vs am
Mazda RX4           21.0   6  0  1
Mazda RX4 Wag       21.0   6  0  1
Datsun 710          22.8   4  1  1
....

これは他のほとんどのソリューションよりもテストが遅くなると確信していますが、マイクロ秒が違いを生む時点ではめったにありません。

9
Chase

Read.tableを "NULL"のcolClassesインスタンスと共に使用して、そもそもインスタンスを作成しないようにします。

## example data and temp file
x <- data.frame(x = 1:10, y = rnorm(10), z = runif(10), a = letters[1:10], stringsAsFactors = FALSE)
tmp <- tempfile()
write.table(x, tmp, row.names = FALSE)


(y <- read.table(tmp, colClasses = c("numeric", rep("NULL", 2), "character"), header = TRUE))

x a
1   1 a
2   2 b
3   3 c
4   4 d
5   5 e
6   6 f
7   7 g
8   8 h
9   9 i
10 10 j

unlink(tmp)
7
mdsumner

取得する傾向のある大きなファイルの種類については、一般にRでもこれを行いません。Linuxでcutコマンドを使用して、Rに到達する前にデータを処理します。これは批評ではありませんR、正規表現についてやるべきことがあるときにgrep、tr、cut、sort、uniq、sed&awk(またはPerl)などの非常に基本的なLinuxツールを使用するための好み。

標準のGNUコマンドを使用するもう1つの理由は、コマンドをデータのソースに戻し、余分なデータが得られないようにデータを事前にフィルター処理するように依頼できることです。 Linuxに対応しており、Rを知っている人はほとんどいません。

(更新)やがて使用したい方法は、mmapをテキストファイルとペアにして、データをRAMに読み込むのではなく、in sitを調べることです。私はこれをCで実行しましたが、非常に高速です。

5
Iterator

代わりに、列IDを使用してこれを実行したいことがあります。

df <- data.frame(a=rnorm(100),
b=rnorm(100),
c=rnorm(100),
d=rnorm(100),
e=rnorm(100),
f=rnorm(100),
g=rnorm(100)) 

as.data.frame(names(df))

  names(df)
1         a
2         b
3         c
4         d
5         e
6         f
7         g 

列「c」および「g」の削除

df[,-c(3,7)]

これは、data.framesが大きい場合や、入力したくない長い列名がある場合に特に便利です。または、パターンに続く列名。seq()を使用して削除できるためです。

RE:編集

文字列を「」で囲む必要はなく、文字ベクトルを作成するために「、」を入れる必要もありません。この小さなトリックが便利だと思います。

x <- unlist(strsplit(
'A
B
C
D
E',"\n"))
3

から http://www.statmethods.net/management/subset.html

# exclude variables v1, v2, v3
myvars <- names(mydata) %in% c("v1", "v2", "v3") 
newdata <- mydata[!myvars]

# exclude 3rd and 5th variable 
newdata <- mydata[c(-3,-5)]

# delete variables v3 and v5
mydata$v3 <- mydata$v5 <- NULL

「含まれない」のリストを作るのは本当に賢いと思った

2
jesusgarciab

setdiff関数を使用できます:

削除するよりも保持する列が多い場合:delete 2列、たとえばdata.frame DTのcol1、col2を使用するとします。次のことができます。

DT<-DT[,setdiff(names(DT),c("col1","col2"))]

保持する列よりも削除する列が多い場合:keep col1とcol2のみにしたい場合:

DT<-DT[,c("col1","col2")]
1
Bindu

編集に対処するだけです。

@nzcoopsでは、コンマ区切りの文字ベクトル内の列名needを使用しません。あなたはこれについて間違った方法で考えています。するとき

_vec <- c("col1", "col2", "col3")
_

あなたは作成文字ベクトルです。 _,_は、そのベクトルを定義するときにc()関数がとる引数を分離するだけです。 names()および同様の関数return名前の文字ベクトル。

_> dat <- data.frame(col1 = 1:3, col2 = 1:3, col3 = 1:3)
> dat
  col1 col2 col3
1    1    1    1
2    2    2    2
3    3    3    3
> names(dat)
[1] "col1" "col2" "col3"
_

names(dat)の要素から選択する方が、カットアンドペーストできるコンマ区切りの文字列に出力を処理するよりもはるかに簡単で、エラーが少なくなります。

カラム_col1_および_col2_、サブセットnames(dat)が必要で、必要なものだけを保持するとします。

_> names(dat)[c(1,3)]
[1] "col1" "col3"
> dat[, names(dat)[c(1,3)]]
  col1 col3
1    1    1
2    2    2
3    3    3
_

やりたいことができますが、Rは常にベクトルを引用符で画面に出力します_"_:

_> paste('"', names(dat), '"', sep = "", collapse = ", ")
[1] "\"col1\", \"col2\", \"col3\""
> paste("'", names(dat), "'", sep = "", collapse = ", ")
[1] "'col1', 'col2', 'col3'"
_

後者の方が便利かもしれません。ただし、その文字列から切り取って貼り付ける必要があります。必要なものを返すオブジェクトを操作し、標準のサブセット化ルーチンを使用して必要なものを保持する方がはるかに優れています。

1
Gavin Simpson

Dplyrのselect()関数は、列のサブセット化に強力です。アプローチのリストについては、_?select_helpers_を参照してください。

この場合、共通のプレフィックスと列名の連続番号がある場合、_num_range_を使用できます。

_library(dplyr)

df1 <- data.frame(first = 0, col1 = 1, col2 = 2, col3 = 3, col4 = 4)
df1 %>%
  select(num_range("col", c(1, 4)))
#>   col1 col4
#> 1    1    4
_

より一般的には、select()でマイナス記号を使用して、次のように列を削除できます。

_mtcars %>%
   select(-mpg, -wt)
_

最後に、「列名の実用的なベクトルを作成する簡単な方法はありますか?」 -はい、名前のリストを手動で編集する必要がある場合は、dputを使用して、カンマ区切りの引用符付きリストを簡単に操作できます。

_dput(names(mtcars))
#> c("mpg", "cyl", "disp", "hp", "drat", "wt", "qsec", "vs", "am", 
#> "gear", "carb")
_
1
Sam Firke

すでにいくつかの方法で作成できる名前のベクトルがある場合は、サブセット関数を使用して簡単にオブジェクトを保持または削除できます。

dat2 <- subset(dat, select = names(dat) %in% c(KEEP))

この場合、KEEPは事前に作成された列名のベクトルです。例えば:

#sample data via Brandon Bertelsen
df <- data.frame(a=rnorm(100),
                 b=rnorm(100),
                 c=rnorm(100),
                 d=rnorm(100),
                 e=rnorm(100),
                 f=rnorm(100),
                 g=rnorm(100))

#creating the initial vector of names
df1 <- as.matrix(as.character(names(df)))

#retaining only the name values you want to keep
KEEP <- as.vector(df1[c(1:3,5,6),])

#subsetting the intial dataset with the object KEEP
df3 <- subset(df, select = names(df) %in% c(KEEP))

結果:

> head(df)
            a          b           c          d
1  1.05526388  0.6316023 -0.04230455 -0.1486299
2 -0.52584236  0.5596705  2.26831758  0.3871873
3  1.88565261  0.9727644  0.99708383  1.8495017
4 -0.58942525 -0.3874654  0.48173439  1.4137227
5 -0.03898588 -1.5297600  0.85594964  0.7353428
6  1.58860643 -1.6878690  0.79997390  1.1935813
            e           f           g
1 -1.42751190  0.09842343 -0.01543444
2 -0.62431091 -0.33265572 -0.15539472
3  1.15130591  0.37556903 -1.46640276
4 -1.28886526 -0.50547059 -2.20156926
5 -0.03915009 -1.38281923  0.60811360
6 -1.68024349 -1.18317733  0.42014397

> head(df3)
        a          b           c           e
1  1.05526388  0.6316023 -0.04230455 -1.42751190
2 -0.52584236  0.5596705  2.26831758 -0.62431091
3  1.88565261  0.9727644  0.99708383  1.15130591
4 -0.58942525 -0.3874654  0.48173439 -1.28886526
5 -0.03898588 -1.5297600  0.85594964 -0.03915009
6  1.58860643 -1.6878690  0.79997390 -1.68024349
            f
1  0.09842343
2 -0.33265572
3  0.37556903
4 -0.50547059
5 -1.38281923
6 -1.18317733
1
Levi Weible