2017-10-13 2 views
1

複数のcsvファイルのディレクトリを読み込もうとしていますが、それぞれ約7K +行と約1800列です。私は、データ・ディクショナリを持っていて、データ・フレームに読み込むことができます。ここで、データ・ディクショナリの各行は、変数(列)名とデータ型を識別します。データフレーム内の値を使用してread_csvに列の種類を指定します。

readrパッケージ内にある?read_csvを見ると、列の種類を指定することができます。しかし、私は約1800の列を指定しているので、使用可能なデータ・ディクショナリからの情報を使用して、関数が必要とする適切な形式の列/型のペアを指定したいと考えていました。

あまり望ましくない選択肢は、すべての列を文字として読み取り、必要に応じて手作業で修正することです。

どのように列の種類を指定するかについてご意見をいただければ幸いです。

私が参考にしている形式にデータ辞書を取得して同軸化するのに役立ちます。

## Get the data dictionary 
URL = "https://collegescorecard.ed.gov/assets/CollegeScorecardDataDictionary.xlsx" 
download.file(URL, destfile="raw-data/dictionary.xlsx") 

## read in the dictionary to get the variables 
dict = read_excel("raw-data/dictionary.xlsx", sheet = "data_dictionary") 
colnames(dict) = tolower(gsub(" ", "_", colnames(dict))) 
dict = dict %>% filter(!is.na(variable_name)) 

## create a data dictionary 
## https://stackoverflow.com/questions/46738968/specify-column-types-in-read-csv-by-using-values-in-a-dataframe/46742411#46742411 
dict <- dict %>% mutate(variable_type = case_when(api_data_type == "integer" ~ "i", 
                api_data_type == "autocomplete" ~ "c", #assumption that this is a string 
                api_data_type == "string" ~ "c", 
                api_data_type == "float" ~ "d")) 

リターン:

> ## read in the dictionary to get the variables 
> dict = read_excel("raw-data/dictionary.xlsx", sheet = "data_dictionary") 
> colnames(dict) = tolower(gsub(" ", "_", colnames(dict))) 
> dict = dict %>% filter(!is.na(variable_name)) 
> dict <- dict %>% mutate(variable_type = case_when(api_data_type == "integer" ~ "i", 
+             api_data_type == "autocomplete" ~ "c", #assumption that this is a string 
+             api_data_type == "string" ~ "c", 
+             api_data_type == "float" ~ "d")) 
Error: object 'api_data_type' not found 

と私のSessionInfo

> sessionInfo() 
R version 3.3.1 (2016-06-21) 
Platform: x86_64-apple-darwin13.4.0 (64-bit) 
Running under: OS X 10.11.6 (El Capitan) 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] stringr_1.2.0 readxl_0.1.1 readr_1.1.0 dplyr_0.5.0 

loaded via a namespace (and not attached): 
[1] rjson_0.2.15 lazyeval_0.2.0 magrittr_1.5 R6_2.2.2  assertthat_0.1 hms_0.2  DBI_0.7  tools_3.3.1 
[9] tibble_1.2  yaml_2.1.14 Rcpp_0.12.11 stringi_1.1.5 jsonlite_1.5 
+0

私はすぐに "完全" 再現性の解決策を掲載します。 – Jas

+0

dplyrのバージョンをアップグレードする必要があるかもしれません。私はv0.7.4 – Jas

答えて

1

あなたは、コンパクトな文字列表現を使用してapi_data_type列をマップするためにmutatecase_whenの組み合わせを使用することができます。ここでは、各文字列の型は、c =文字、i =整数、n =数、d = double、l =論理などの1文字で表されます。col_typesの引数read_csvにこの文字ベクトルを使用できます。

## Load libraries 
library(dplyr) 
library(readxl) 

## Get the data dictionary 
URL = "https://collegescorecard.ed.gov/assets/CollegeScorecardDataDictionary.xlsx" 
download.file(URL, destfile="raw-data/dictionary.xlsx") 

## read in the dictionary to get the variables 
dict = read_excel("raw-data/dictionary.xlsx", sheet = "data_dictionary") 
colnames(dict) = tolower(gsub(" ", "_", colnames(dict))) 
dict = dict %>% filter(!is.na(variable_name)) 

unique(dict$api_data_type) 
#> [1] "integer"  "autocomplete" "string"  "float" 

dict <- dict %>% mutate(variable_type = case_when(api_data_type == "integer" ~ "i", 
                api_data_type == "autocomplete" ~ "c", #assumption that this is a string 
                api_data_type == "string" ~ "c", 
                api_data_type == "float" ~ "d" 
               ) 
         ) 
cnames <- dict %>% select(variable_name) %>% pull 
head(cnames) 
#> [1] "UNITID" "OPEID" "OPEID6" "INSTNM" "CITY" "STABBR" 
ctypes <- dict %>% select(variable_type) %>% pull 
head(ctypes) 
#> [1] "i" "i" "i" "c" "c" "c" 
+0

上記のアップデートを参照してください。私はあなたが私にあなたの提案をしたときに得たコードを拡張したいと思っていました。エラーを見てください。しかし、私は 'case_when'を認識していませんでしたので、そのユースケースでは+100 – Btibert3

+0

問題はありません。この完全に再現可能な例を試してみてください。コードを実行する前にセッションを再開することを忘れないでください。 – Jas

+0

カラムがデータ辞書と一致しない問題が発生しましたが、これは大きな助けとなりました。とても有難い – Btibert3

関連する問題