2017-11-30 15 views
1

Rのライブラリ(readr)とread_csv()関数に関する私の好きなことの1つは、ほとんど常にデータの列タイプを正しいクラスに設定することです。しかし、私は現在、データが明らかに数字であっても、すべての文字クラスのデータフレームとしてデータを返すRのAPIを使用しています。いくつかのスポーツのデータを持っている、例えば、このデータフレームを取る:列タイプをread_csv()列タイプに変換するR

dput(mydf) 
structure(list(isUnplayed = c("false", "false", "false"), isInProgress = 
c("false", "false", "false"), isCompleted = c("true", "true", "true"), awayScore = c("106", 
"95", "95"), homeScore = c("94", "97", "111"), game.ID = c("31176", 
"31177", "31178"), game.date = c("2015-10-27", "2015-10-27", 
"2015-10-27"), game.time = c("8:00PM", "8:00PM", "10:30PM"), 
    game.location = c("Philips Arena", "United Center", "Oracle Arena" 
    ), game.awayTeam.ID = c("88", "86", "110"), game.awayTeam.City = c("Detroit", 
    "Cleveland", "New Orleans"), game.awayTeam.Name = c("Pistons", 
    "Cavaliers", "Pelicans"), game.awayTeam.Abbreviation = c("DET", 
    "CLE", "NOP"), game.homeTeam.ID = c("91", "89", "101"), game.homeTeam.City = c("Atlanta", 
    "Chicago", "Golden State"), game.homeTeam.Name = c("Hawks", 
    "Bulls", "Warriors"), game.homeTeam.Abbreviation = c("ATL", 
    "CHI", "GSW"), quarterSummary.quarter = list(structure(list(
     `@number` = c("1", "2", "3", "4"), awayScore = c("25", 
     "23", "34", "24"), homeScore = c("25", "18", "23", "28" 
     )), .Names = c("@number", "awayScore", "homeScore"), class = "data.frame", row.names = c(NA, 
    4L)), structure(list(`@number` = c("1", "2", "3", "4"), awayScore = c("17", 
    "23", "28", "27"), homeScore = c("26", "20", "25", "26")), .Names = c("@number", 
    "awayScore", "homeScore"), class = "data.frame", row.names = c(NA, 
    4L)), structure(list(`@number` = c("1", "2", "3", "4"), awayScore = c("35", 
    "14", "26", "20"), homeScore = c("39", "20", "35", "17")), .Names = c("@number", 
    "awayScore", "homeScore"), class = "data.frame", row.names = c(NA, 
    4L)))), .Names = c("isUnplayed", "isInProgress", "isCompleted", 
"awayScore", "homeScore", "game.ID", "game.date", "game.time", 
"game.location", "game.awayTeam.ID", "game.awayTeam.City", "game.awayTeam.Name", 
"game.awayTeam.Abbreviation", "game.homeTeam.ID", "game.homeTeam.City", 
"game.homeTeam.Name", "game.homeTeam.Abbreviation", "quarterSummary.quarter" 
), class = "data.frame", row.names = c(NA, 3L)) 

それはクラス型与え、APIによって返されたら、このデータフレームに対処するため、非常に面倒です。 CSVに書き込むことにより

write_csv(mydf, 'mydf.csv') 
mydf <- read_csv('mydf.csv') 

、その後read_csv()、データフレームの列の更新を使用してCSVを読み取り再:私は次のようである、列クラスを更新するために、ハックのようなものを作ってみました。残念ながら私のディレクトリには私が望まないCSVファイルが残っています。 Rデータフレームの列を 'read_csv()'列クラスに更新する方法はありますか?実際にはCSVを書き込む必要はありませんか?

ご協力いただきましてありがとうございます。

+0

は、あなたがしたい場所を取得する書き込みや読み出しのcsvには注意してください(もしあれば)因子(それらは文字に変換されます)。 APIが適切に設定されていれば、形式の整ったデータが得られることが予想されるため、要素が要因になるはずです。これは、プロット時などの一貫した注文には重要です。 – Tino

答えて

3

あなたはちょうどreadrはあなたに列タイプを推測したい場合は、データを読み書きする必要はありません。あなたはそのためのreadr::type_convertを使用することができます。

iris %>% 
    dplyr::mutate(Sepal.Width = as.character(Sepal.Width)) %>% 
    readr::type_convert() %>% 
    str() 

比較のために:あなたのコードで---あなたを失うことになる---ので

iris %>% 
    dplyr::mutate(Sepal.Width = as.character(Sepal.Width)) %>% 
    str() 
1

このコードを試してください。type.convert文字ベクトルを論理、整数、数値、複合または因子に変換してください。

indx <- which(sapply(df, is.character)) 
df[, indx] <- lapply(df[, indx], type.convert) 
indx <- which(sapply(df, is.factor)) 
df[, indx] <- lapply(df[, indx], as.character) 
関連する問題