web-dev-qa-db-ja.com

リーダーの特定の列の読み取りをスキップする方法

次の内容の「test.csv」というシンプルなcsvファイルがあります。

colA,colB,colC
1,"x",12
2,"y",34
3,"z",56

ColAの読み取りをスキップして、colBとcolCだけを読み取りたいとしましょう。読み込むファイルがたくさんあり、時にはcolAが別の名前で呼ばれることもありますが、colBとcolCは常に同じであるため、これを行うための一般的な方法が必要です。

Read_csvのドキュメントによると、これを行う1つの方法は、col_typesの名前付きリストを渡して、保持したい列のみに名前を付けることです。

read_csv('test.csv', col_types = list(colB = col_character(), colC = col_numeric()))

ColAについて言及しないことで、出力から削除されます。ただし、結果のデータフレームは次のとおりです。

Source: local data frame [3 x 3]

      colA colB colC
    1    1    x   12
    2    2    y   34
    3    3    z   56

私は何か間違っているのですか、それともread_csvのドキュメントが正しくありませんか?ヘルプファイルによると:

リストの場合、列ごとに1つの「コレクター」が含まれている必要があります。列のサブセットのみを読み取りたい場合は、名前付きリストを使用できます(名前によって列名が与えられます)。列が名前で言及されていない場合、その列は出力に含まれません。

19
vergilcw

そこに答えがあります、私は十分に検索しませんでした: https://github.com/hadley/readr/issues/132

どうやらこれは修正されたドキュメントの問題でした。この機能は最終的に追加される可能性がありますが、Hadleyは、1つの列タイプのみを更新し、他の列タイプは削除しない方が便利だと考えました。

更新:機能が追加されました

次のコードは reader documentation からのものです。

read_csv("iris.csv", col_types = cols_only( Species = col_factor(c("setosa", "versicolor", "virginica"))))

これにより、アヤメのデータセットの「種」列のみが読み取られます。特定の列のみを読み取るには、列の指定、つまりcol_factorcol_doubleなども渡す必要があります。

11
vergilcw

「read_csvのドキュメントによると、これを行う1つの方法は、col_typesの名前付きリストを渡して、保持する列にのみ名前を付けることです」

_WRONG: read_csv('test.csv', col_types=list(colB='c', colC='c'))
_

いいえ、ドキュメントは誤解を招く可能性があります。名前のないcolsが削除されるように指定するか(class = _'_'_/col_skip())、または明示的にクラスをNULLとして指定する必要があります。

_read_csv('test.csv', col_types=list('*'='_', colB='c', colC='c'))

read_csv('test.csv', col_types=list('colA'='_', colB='c', colC='c'))
_
3
smci