6

数百列を含む data.frame から 1 列を削除する必要があります。

を使用して、これを便利に行うためにdata.frame使用します。subset

> dat <- data.table( data.frame(x=runif(10),y=rep(letters[1:5],2),z=runif(10)),key='y' )
> subset(dat,select=c(-z))
            x y
 1: 0.1969049 a
 2: 0.7916696 a
 3: 0.9095970 b
 4: 0.3529506 b
 5: 0.4923602 c
 6: 0.5993034 c
 7: 0.1559861 d
 8: 0.9929333 d
 9: 0.3980169 e
10: 0.1921226 e

明らかにこれはまだ機能しますが、あまり - のdata.tableようなイディオムではないようです。保持したい列名のリストを手動で作成できますが、これはもう少しdata.table似ています。

> dat[,list(x,y)]
            x y
 1: 0.1969049 a
 2: 0.7916696 a
 3: 0.9095970 b
 4: 0.3529506 b
 5: 0.4923602 c
 6: 0.5993034 c
 7: 0.1559861 d
 8: 0.9929333 d
 9: 0.3980169 e
10: 0.1921226 e

しかし、そのようなリストを作成する必要がありますが、これは扱いにくいものです。

subset1 つまたは 2 つの列を簡単に削除する適切な方法はありますか、それともパフォーマンス ヒットを引き起こしますか? そうでない場合、より良い方法は何ですか?

編集

ベンチマーク:

> dat <- data.table( data.frame(x=runif(10^7),y=rep(letters[1:10],10^6),z=runif(10^7)),key='y' )
> microbenchmark( subset(dat,select=c(-z)), dat[,list(x,y)] )
Unit: milliseconds
                         expr       min        lq    median        uq      max
1           dat[, list(x, y)] 102.62826 167.86793 170.72847 199.89789 792.0207
2 subset(dat, select = c(-z))  33.26356  52.55311  53.53934  55.00347 180.8740

しかし、実際にもっと重要なのはsubset、全体をコピーする場合のメモリですdata.table

4

2 に答える 2

9

列を永久に削除したい場合は、:= NULL

dat[, z := NULL]

文字列としてドロップする列がある場合は()、文字名としてではなく、文字列として評価を強制するために使用します。

toDrop <- c('z')

dat[, (toDrop) := NULL]

で列の使用可能性を制限したい場合は、引数.SDを渡すことができます.SDcols

dat[,lapply(.SD, somefunction) , .SDcols = setdiff(names(dat),'z')]

ただし、引数をdata.table検査し、j使用する列のみを取得します。FAQ 1.12 を参照

X[Y,sum(foo*bar)] と記述すると、data.table は自動的に j 式を検査して、使用する列を確認します。

のすべてのデータをロードしようとはしません.SD(.SDへの呼び出し内にない限りj)


subset.data.table呼び出しを処理し、最終的に評価していますdat[, c('x','y'), with=FALSE]

:= NULL基本的に瞬時に使用する必要がありますが、列を完全に削除します。

于 2013-05-10T00:35:21.507 に答える
1

これがあなたが探しているものだと思います。

dat[, !"z"]

これは、編集からの膨大なデータのベンチマークです。

Unit: milliseconds
                         expr       min        lq    median       uq      max neval
  subset(dat, select = c(-z))  53.37435  56.82514  61.81279 100.3458 339.1400   100
            dat[, list(x, y)] 191.46678 354.39905 412.06421 451.3933 678.3981   100
                  dat[, !"z"]  53.49184  57.31756  62.15506 112.7063 398.0107   100
于 2013-05-10T00:43:46.333 に答える