2017-11-30 16 views
1

라이브러리 (readr) 및 read_csv() 함수에 대한 R에서 가장 좋아하는 점은 거의 항상 데이터의 열 유형을 올바른 클래스로 설정한다는 것입니다. 그러나 현재 데이터가 명확하게 숫자 인 경우에도 모든 문자 클래스의 데이터 프레임으로 데이터를 반환하는 R의 API를 사용하고 있습니다. 일부 스포츠 데이터가 예를 들어이 dataframe을 보자 :열 유형을 read_csv() 열 유형으로 변환하십시오.

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에 의해 반환되면이 dataframe 다루는 꽤 번거 로움입니다. 다시 읽는 CSV 사용 read_csv()를 dataframe 열 업데이트를 다음 CSV로 작성하여

write_csv(mydf, 'mydf.csv') 
mydf <- read_csv('mydf.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)