2016-09-06 4 views
4

SQLテーブルのカラム(フィールド?)タイプを取得するためのdplyr(または他のパッケージ)コマンドはありますか?たとえば...dplyrを使用してSQLテーブルのカラムタイプを取得

library(RSQLite) 
library(dplyr) 

data(iris) 

dat_sql <- src_sqlite("test.sqlite", create = TRUE) 
copy_to(dat_sql, iris, name = "iris_df") 

iris_tbl <- tbl(dat_sql, "iris_df") 
iris_tbl 
# Source: query [?? x 5] 
# Database: sqlite 3.8.6 [test.sqlite] 
# 
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
#   <dbl>  <dbl>  <dbl>  <dbl> <chr> 
# 1   5.1   3.5   1.4   0.2 setosa 
# 2   4.9   3.0   1.4   0.2 setosa 
# 3   4.7   3.2   1.3   0.2 setosa 
# 4   4.6   3.1   1.5   0.2 setosa 
# 5   5.0   3.6   1.4   0.2 setosa 
# 6   5.4   3.9   1.7   0.4 setosa 
# 7   4.6   3.4   1.4   0.3 setosa 
# 8   5.0   3.4   1.5   0.2 setosa 
# 9   4.4   2.9   1.4   0.2 setosa 
# 10   4.9   3.1   1.5   0.1 setosa 
# # ... with more rows 

は、私が最初の4列は、タイプdblのものであり、最後はchrであることを私に言うだろう、そのコマンドに興味がある(またはより良いまだ、Rタイプnumericcharacter実際にはありませんcollectメモリ内のデータ。印刷されているので、これを行う方法がなければなりません、そうですか?私は無駄にstrを試してみました:列はページ、 をダウンを実行し、データは全体の実行されます。

str(iris_tbl) 
# List of 2 
# $ src:List of 2 
# ..$ con :Formal class 'SQLiteConnection' [package "RSQLite"] with 5 slots 
# .. .. [email protected] Id     :<externalptr> 
# .. .. [email protected] dbname    : chr "test.sqlite" 
# .. .. [email protected] loadable.extensions: logi TRUE 
# .. .. [email protected] flags    : int 6 
# .. .. [email protected] vfs    : chr "" 
# ..$ path: chr "test.sqlite" 
# ..- attr(*, "class")= chr [1:3] "src_sqlite" "src_sql" "src" 
# $ ops:List of 3 
# ..$ src :List of 2 
# .. ..$ con :Formal class 'SQLiteConnection' [package "RSQLite"] with 5 slots 
# .. .. .. [email protected] Id     :<externalptr> 
# .. .. .. [email protected] dbname    : chr "test.sqlite" 
# .. .. .. [email protected] loadable.extensions: logi TRUE 
# .. .. .. [email protected] flags    : int 6 
# .. .. .. [email protected] vfs    : chr "" 
# .. ..$ path: chr "test.sqlite" 
# .. ..- attr(*, "class")= chr [1:3] "src_sqlite" "src_sql" "src" 
# ..$ x :Classes 'ident', 'sql', 'character' chr "iris_df" 
# ..$ vars: chr [1:5] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" ... 
# ..- attr(*, "class")= chr [1:3] "op_base_remote" "op_base" "op" 
# - attr(*, "class")= chr [1:4] "tbl_sqlite" "tbl_sql" "tbl_lazy" "tbl" 
# NULL 

答えて

4

リモートテーブルのプレビューを印刷すると、dplyrがテーブルの最初の数行にcollectを使用しているように見えます。 dplyrはいくつかのサンプル・データを検索するので、これも同様に行うことができます。

ここでは、クエリ結果をhead,collectとした最初の数行をクエリし、各列のクラスを調べます。

iris_tbl %>% 
    head %>% 
    collect %>% 
    lapply(class) %>% 
    unlist 
#> Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
#> "numeric" "numeric" "numeric" "numeric" "character" 

(データフレームで使用される、lapplyは列方向関数適用を行うので、各列にclassが適用されます。)

用途をdplyrタイプ名を取得するには、type_sumを使用しています。

iris_tbl %>% head %>% collect %>% lapply(type_sum) %>% unlist 
#> Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
#>  "dbl"  "dbl"  "dbl"  "dbl"  "chr" 
+0

満足できないと感じますが、機能していることを否定できません!大きなデータベースの 'head'(または' tail')ステートメントにオーバーヘッドがかかっているかどうか知っていますか?私はしばしば数百万行のオーダーのデータを扱います。 –

+0

また、 'type_sum'に+1がありました。間違いなく、以前はそのコマンドに気付かなかったのです! –

+1

ソースコードで判断すると、SQL dbsのように見えます。 'head(...、n)'は 'n'行の' limit'を持つ 'select'文に変換されます。 –

3

これは、印刷の転置バージョンのようなものですglimpse()

を見てください。これにより、 データフレーム内のすべての列を表示することができます。これはデータフレームに適用されるstrのようなものですが、 は可能な限り多くのデータを表示しようとします。 (そして、それは常に、リモート・データ・ソースに適用された場合でも 基礎データ、を示し。)

与える:

> glimpse(iris_tbl) 
#Observations: NA 
#Variables: 5 
#$ Sepal.Length <dbl> 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0,... 
#$ Sepal.Width <dbl> 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4,... 
#$ Petal.Length <dbl> 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5,... 
#$ Petal.Width <dbl> 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2,... 
#$ Species  <chr> "setosa", "setosa", "setosa", "setosa",... 

はあなたが可能性のベクトルを取得したいなら操作を行います。

vapply(as.data.frame(head(iris_tbl)), typeof, character(1)) 

与える:

#Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
# "double"  "double"  "double"  "double" "character" 
+0

実際にデータのサブセットを収集することなくタイプを含む「最初の列」に実際にアクセスする方法はまだわかりません。 –

関連する問題