/ R

R 기초강의(10) - R 데이터 입출력

R 강좌는 여러 절로 구성되어 있습니다.


R 데이터 입출력

데이터 분석을 하기 위해서는 가장 먼저 분석에 필요한 데이터들을 준비해야 합니다. 이번에는 R의 데이터 입출력에 대해서 알아보겠습니다.

키보드 입력

  • scan()함수와 edit()함수를 이용하여 키보드로 직접 데이터를 입력할 수 있습니다.
# scan() 함수

myNum = scan()    # console창의 prompt를 이용하여 숫자 데이터 입력
myNum

myStr = scan(what=character())  # 문자열 데이터 입력
myStr

# data frame에 edit()를 이용해 데이터 입력

df = data.frame();

my_df = edit(df)    # 데이터 편집기 실행

R 로컬 파일 사용

파일에 저장된 데이터를 가져오기 위해 R은 다양한 함수를 제공하고 있습니다.

read.table() 함수

  • 테이블 형태로 작성되어 있으며 각 컬럼이 구분자로 구분된 자료 파일을 불러 올 수 있는 함수
# read.table() 함수 이용
# header가 있는 경우 "header=TRUE"를 이용

getwd()
setwd(str_c(getwd(),"/data"))

# text 파일 데이터 최 하단에 개행이 1줄 있어야 한다.
student_midterm = read.table(file="student_midterm.txt", sep=",")
student_midterm  

# 한글이 있는 경우 encoding 설정이 필요
# header가 있는 경우 header=T 필요
student_midterm = read.table(file="student_midterm.txt", 
                             sep=",",
                             fileEncoding = "UTF-8",
                             header = T)
student_midterm 

names(student_midterm) = c("학번","반","국어","영어")
student_midterm      

# 만약 탐색기를 실행해서 파일을 선택하려면 file.choose() 사용

student_midterm = read.table(file.choose(), sep=",")
student_midterm

# 파일의 특정 문자열을 NA로 처리하여 파일을 불러올 수 있다.
student_midterm = read.table(file="student_midterm_na.txt", sep=",", na.strings="-")
student_midterm

read.csv() 함수 이용

  • CSV(Comma Separated Value)파일은 comma(“,”)를 기준으로 각 column을 구분하여 저장한 데이터 형식을 의미합니다. read.csv() 함수는 “,”가 sep의 기본값이며 header=TRUE가 기본값입니다.
# read.csv() 함수 이용

getwd()
setwd(str_c(getwd(),"/data"))

student_midterm = read.csv(file="student_midterm.csv", sep=",")
student_midterm      

read.xlsx() 함수 이용

  • 엑셀 파일을 R에서 불러올 수 있습니다. 일단 먼저 xlsx 패키지를 설치해야 합니다. (xlsx 패키지는 rJava 패키지와 dependency가 있습니다. )
# read.xlsx() 함수 이용

install.packages("xlsx")
Sys.setenv(JAVA_HOME="C:\\Program Files\\Java\\jre1.8.0_221")

library(xlsx)
student_midterm = read.xlsx(file.choose(), sheetIndex=1, encoding="UTF-8")

student_midterm

텍스트 파일에 출력

  • 텍스트 파일에 출력하기 위해서는 3가지 함수를 이용할 수 있습니다.
  • write.table() : data frame을 텍스트 파일에 저장할 때 사용합니다.
  • cat() : 분석결과(vector)를 텍스트 파일에 저장할 때 사용합니다.
  • capture.output() : 분석결과(list,table)를 텍스트 파일에 저장할 때 사용합니다.

write.table() 함수 이용

  • R 스크립트에서 처리된 data frame을 저장할 수 있는 함수입니다. 행 번호를 제거하는 속성은 row.names=FALSE 이고 따옴표를 제거하는 속성은 quote=FALSE 입니다.
# # write.table() 함수 이용 - data frame 저장
getwd()
setwd(str_c(getwd(),"/data"))

student_midterm = read.table(file="student_midterm.txt", sep=",")
student_midterm      

names(student_midterm) = c("학번","반","국어","영어")
student_midterm    

write.table(student_midterm, file="student_write_table.txt")
write.table(student_midterm, file="student_write_table.txt", row.names=FALSE, quote=FALSE)

텍스트 파일 처리 예

# cat() 함수 이용
cat("계산된 결과값은 :",
    "\n","\n",
    file="c:/R_workspace/R_Lecture/data/final_result.txt",
    append=TRUE)

# data frame을 출력 
write.table(student_midterm, 
            file="c:/R_workspace/R_Lecture/data/final_result.txt", 
            row.names=FALSE, 
            quote=FALSE, 
            append = T)

# data frame의 summary를 파일에 출력
capture.output(summary(student_midterm),
    file="c:/R_workspace/R_Lecture/data/final_result.txt",
    append=TRUE)

write.xlsx() 함수 이용

  • R에서 처리된 결과를 엑셀 파일로 저장할 수 있습니다.
# write.xlsx() 함수 이용 - 데이터 저장

libray(xlsx)
getwd()
setwd(str_c(getwd(),"/data"))

df = data.frame(x=c(1:5),
                y=seq(2,10,2),
                z=c("a","b","c","d","e"))

write.xlsx(df,"df_write.xlsx")

R에서 JSON 처리

이번에는 jsonlite package를 사용해서 JSON 데이터를 R DataFrame 으로 변환하거나 R DataFrame 을 JSON 데이터로 변환하는 방법을 살펴보겠습니다.

사용하는 데이터는 Servlet으로 작성한 도서검색 프로그램을 실행해서 결과로 나온 JSON을 이용하도록 하겠습니다.

도서검색 프로그램에서 사용할 MySQL DB Script

도서검색 프로그램에서 사용할 Server Side Web Application

# JSON 처리

# jsonlite package의 fromJSON() 함수를 사용
install.packages("jsonlite")
library(jsonlite)

# install.packages("httr")
# library(httr)

library(stringr)

url <- "http://localhost:8080/bookSearch/search"

keyword <- "keyword="

request_url = str_c(url,"?",keyword,scan(what=character()))
request_url

df = fromJSON(request_url) # 키워드가 영문일경우

df = fromJSON(URLencode(request_url)) # 키워드가 한글일 경우 encoding처리 필요

str(df)
names(df)
View(df)

# 찾은 도서 제목 출력
for(i in 1:nrow(df)) {
  print(df$title[i])
}

# data frame을 CSV 파일로 저장
write.csv(df,
          file="C:/R_workspace/R_Lecture/data/df.csv",
          quote=FALSE,
          row.names=FALSE)

# data frame을 JSON 파일로 저장
help(toJSON)
df_json <- toJSON(df)
df_json

library(stringr)
getwd()
setwd(str_c(getwd(),"/data"));
      
write(df_json,file = "df_json.json");
write(prettify(df_json),
      file = "df_json_prettify.json");

비슷한 예로 영화진흥위원회에서 제공하는 Open API를 이용하여 일별 Box Office 순위에 대한 정보를 data frame으로 변환해 보겠습니다.

영화진흥위원회 Open API

url = "http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json"

key = "key=bb9595efebb93c44b9f1271e52bcdf74"

date = "targetDt=20191010"

library(stringr)

request_url = str_c(url,"?",key,"&",date)

df = fromJSON(request_url)

View(df)

class(df[[1]])
class(df[[1]][["dailyBoxOfficeList"]])
class(df[[1]][["dailyBoxOfficeList"]]$movieNm)

for(i in 1:10) {
  print(df[[1]][["dailyBoxOfficeList"]]$movieNm[i])
}

End.


이 포스트의 내용은 아래의 책과 사이트를 참조했습니다. 조금 더 자세한 사항을 알고 싶으시면 책을 참조하거나 해당 사이트를 방문하세요!!