2016-07-15 11 views
0

私はread_excelを使用して、Excelファイルをインポートするのにスピードとシンプルさを実現しています。名前のついた列をすべて削除する

残念ながら、データセットから不要な選択した列を除外する機能はまだありません。努力を惜しまないためににcol_namesという引数を付けて、x1x2などを追跡するよりも簡単です。

私はそのように擬似コードでは、可能な場合はコピーの余分なステップを回避するために、その場でこのような列を除外したいと思います:

read_excel("data.xlsx", col_names = c("x", "keep", "x"))[ , !"x"] 

我々はreadxlパッケージに含まれているサンプルデータセットを使用することができますイラスト:

library(readxl) 
DF <- read_excel(system.file("extdata/datasets.xlsx", package = "readxl"), 
       col_names = c("x", "x", "length", "width", "x"), skip = 1L) 

私はその仕事を見てきたアプローチはまさにその場で動作しない、例えば、DFを格納した、私たちが今できること:

DF <- DF[ , -grep("^x$", names(DF))] 

これは動作しますが、保存することによってDFのコピーを作成してから上書きする必要があります。私は ab initioを正しく割り当てるために、read_excelと同じコマンドで列を削除したいと考えています。

他の同様のアプローチは、私は可能であれば避けることを好む宣言一時変数を、必要、例えば、

col_names <- c("x", "x", "length", "width", "x") 
DF <- read_excel(system.file("extdata/datasets.xlsx", package = "readxl"), 
       col_names = col_names, skip = 1L)[ , -grep("^x$", col_names)] 

は、不要な一時変数を作成することなく、これらの列をAXにそこの方法ですか?

(私はdata.tableに変換することができますが、data.tableずにそうする方法があるかどう疑問に思って)

+1

あなたは 'dplyr'を使用していますか?明示的に変数を作成せずに 'select()'にパイプすることができます。 (もちろん、名前の有無にかかわらず、完全なdata.frameは存在します。)唯一の問題が余分な変数であれば、独自の関数 'dropXcolumns()'などを作成してください。 – MrFlick

+2

「保存してDFのコピーを作成する必要があります」:コピーを1ライナーにしてもコピーが作成されると思いますので、あなたの問題は問題ありません。コピーを避ける唯一の方法は 'read_excel'が明示的にそれを許可している場合です(' data.table :: fread'の 'select'引数に似ています)。 – nicola

+1

'XLConnnect :: readWorksheet'(より良い文書がありますが、おそらく' readWorksheetFromFile'が必要です)には、列の 'keep'と' drop'パラメータがあります。Javaベースのため、インストールは通常よりも少し複雑です。 – alistaire

答えて

2

あり、それは少し隠されたのですけれども、実際、readxl::read_excelでこれを行う方法で、列がメモリに読み込まれている場合、私は[一時的]にかかわらず、見当がつかない。

readxl::read_excel(system.file("extdata/datasets.xlsx", package = "readxl"), 
        col_types = c('blank', 'blank', 'numeric', 'numeric', 'text')) 
## # A tibble: 150 x 3 
## Petal.Length Petal.Width Species 
##   <dbl>  <dbl> <chr> 
## 1   1.4   0.2 setosa 
## 2   1.4   0.2 setosa 
## 3   1.3   0.2 setosa 
## 4   1.5   0.2 setosa 
## 5   1.4   0.2 setosa 
## 6   1.7   0.4 setosa 
## 7   1.4   0.3 setosa 
## 8   1.5   0.2 setosa 
## 9   1.4   0.2 setosa 
## 10   1.5   0.1 setosa 
## # ... with 140 more rows 

の注意点は、あなたが欲しいの列のすべてのデータ型を知っておく必要があるということです、私はあなたが常にできたと仮定しても:トリックは、あなたがしたくない人のため"blank"に入れて、列の型を指定することですテキストで始まり、後でtype.convertなどでクリーンアップしてください。

+0

私は[#193](https://github.com/hadley/readxl/issues/193)に 'readxl'を書いてきましたが、これは実際にはほとんど文書化されていません。 – MichaelChirico

+1

とにかく、私がC++コードを正しく理解していれば、 ''空白 ''の列は何も読み取られません(?)[ここ](https://github.com/hadley/readxl/blob/7c7f66b29764eee91385c9f1fc755b1ac6c10e08/src /CellType.h#L132-L141)。よくできました! – MichaelChirico

2

私はコピーを回避するための簡単な方法が表示されません。しかし、一時的な変数を必要とせずに配管を使用して1つのライナーを達成することができます。例えば:

library(magrittr) 
read_excel(system.file("extdata/datasets.xlsx", package = "readxl"), 
      col_names = c("x", "x", "length", "width", "x"), skip = 1L) %>% 
    extract(, -grep("^x$", names(.))) -> 
    DF 
関連する問題