앞선 실습에서는 직접 데이터를 만들어서 함수 출력용으로 테스트 해봤지만,
현실적으로 직접 만드는 데이터는 검증용 목적 외에는 크게 의미가 없다.
왜냐하면, 데이터를 분석하는 입장에서는 어딘가에는 축적된 데이터가 분명히 있을 것이기 때문이다.
결국에는 DB든 엑셀이든 메모장이든 어떤 형태의 데이터를 로드(load)해야 할 것이다.
이런 경우에 활용할 함수를 익혀보도록 하자.
※ 수정 21.01.12 - readxl() 함수 이용 부분 변경
- 실제 배포 사이트 확인 결과 다른 블로그에서 봤던 함수명과 차이가 존재했다.
- read_excel(), read_xls(), read_xlsx() 의 형태로 이용 가능하다.
1. csv파일 불러오기
- csv(comma-seperated value)파일은 말 그대로 콤마(,)로 데이터가 구분되어있는 파일이다.
- 우리 눈에야 엑셀칸에 구분된 것처럼 보이지만, 실상은 콤마로 구분된 것이다.
- 참고로 그냥 read.table만 쓰면 로드는 하지만 변수에 저장되지 않아 사용할 수 없음을 유의한다.
test <- read.table("파일 절대 경로\\test.csv", header=TRUE, sep=",") #범용으로 쓸 수 있는 read.table함수 이용 방법, 구분자 명시 test <-read.csv("파일 절대 경로\\test.csv", header=TRUE) # 위의 read.table과 동일한 형태이나, 콤마 구분자인 csv만 # 로드가 가능하여 별도 구분자 명시 필요 없다.(물론 해도 No상관) test <- read.csv2("파일 절대 경로\\test.csv", header=TRUE) # 구분자가 ';' 로 된 csv파일을 로드한다. |
- 매번 절대경로를 입력하기 귀찮은 경우 아래처럼 working directory를 정하면 쉽게 이용할 수 있다.
setwd("C:\\Users\\rainbow\\Desktop\\") #여기서 주의할점은 윈도우에서는 \로 보이는 것이 R에서는 역슬래시로 보인다는 점이다. #그리고 윈도우에서의 경로는 \ 1개를 넣어줄 때, R studio에서는 '\\' 2개 넣어줘야 한다. #필자는 바탕화면을 working directory로 지정했다. test <- read.csv("test.csv", header=T) # TRUE대신 간편하게 T를 넣을 수 있다. |
2. txt파일 불러오기
- read.table을 이용한다는 점은 차이가 없으나, 이용이 조금 까다로운 편이다.
- txt파일에 데이터가 어떤식으로 나열되어있는지 확인 후에 조건을 지정해줘야 한다.
- 아래 txt파일은 띄어쓰기로 데이터가 구분됐고, 로드시 행 번호는 자동으로 부여됐음을 확인할 수 있다.
- 또한, 'header=T'가 없어도 자동적으로 헤더로 인식한 것을 볼 수 있다.
[txt파일예시(1)]![]() |
[R studio 코딩] test <- read.table("test.txt") ![]() |
- 그리고 아래와 같은 경고가 발생할텐데, 그냥 txt파일 마지막줄에 엔터 입력으로 한줄을 넣어주면 된다.
![]() |
- 그리고 아래와 같은 예시를 보도록 하자.
[txt파일예시(2)]![]() |
[R studio 코딩] test <- read.table("test.txt", sep=",") ![]() |
- 뭔가 이상한점을 발견했나?(답은 아래 드래그)
- 이름보다 데이터가 더 많다. R은 어떻게 인식할까? 열 이름수에 맞춰서 데이터를 체크한다. 즉, 맨 앞의 데이터는
행 번호로 들어가버리는 어처구니 없는 사태가 벌어진다. 이래서 은근히 까다롭다는 거였다.
- 확실하게 이해하기 위해 한번 더 테스트를 해보자.
[txt파일예시(3)]![]() |
[R studio 코딩] test <- read.table("test.txt", sep=",") ![]() |
- 이름이 없어도 데이터가 누락없이 잘 입력됐다.
- 마지막으로 예시 하나 더 보도록 하자.
- 아래 형태와 같은 파일이 있을 수 있다.(왜 여기서 언급하는지는 '4번'에서 알 수 있다)
[txt파일예시(4)]![]() |
[R studio 코딩] test <- read.table("out.txt", quote="\"") # quote는 왼쪽 파일의 쌍따옴표를 제거하고 입력받는 # 것이다. 이런 형식은 R에서 조작한 데이터를 파일로 # 다시 저장하는 경우 생긴다. # 쌍따옴표 앞에 '\'이 붙는다는 걸 유의하자. |
- txt파일로 데이터가 있는 경우도 종종 봤기에 다시한번 유의사항을 정리해본다.
<이용 유의사항>
- 일반적으로 txt파일은 엔터를 행을 바꾸는 것으로 자동 인식한다.
- 디폴트로 띄어쓰기를 구분자로 인식한다.
- 구분자(공백, 콤마 등)는 열 이름에도 예외없이 모두 들어가 있어야 한다.
- 데이터의 열 이름이 있는 경우 데이터의 수와 반드시 맞춰줘야 한다.
- 열 이름 개수와 데이터의 열 개수가 맞지 않으면 로드되지 않는다.(에러 발생)
- 특정 문자를 제외하고 입력하려면 quote를 사용한다.
(그 외에는 help함수를 이용해 정의 참고 필수!)
- txt파일은 조심히 다루도록 하자.
3. 엑셀 파일 열기(xls/xlsx)
- 앞서 csv파일이 엑셀파일 아니냐 할수도 있겠는데, 아니다.
- 대충 설명하자면 csv는 옛날 스프레드시트에 쓰이던 확장자, xls/xlsx는 MS가 추진한 XML파일 규격이다.
- 굳이 '엑셀파일'이라고 불러야 한다면 xls, xlsx 확장자가 붙은것이 엑셀파일이다.
- 여러 방법이 있는 데 2가지가 가장 적합한 것 같다.
-----[① readxl패키지 활용]----- #구글을 검색해보니 주로 이 방법을 대부분 이용하는 것 같다. install.package("readxl") #패키지를 설치하는 명령어로 readxl을 설치한다. 쌍따옴표가 있음을 유의한다. library(readxl) #readxl라이브러리를 사용할 것임을 명시해준다. excel1 <- read_excel("절대경로\\엑셀파일명", sheet=숫자) # 참고로 말하지만 절대경로를 입력하기 귀찮으면 setwd을 이용하면 된다. # 'sheet='는 말 그대로 엑셀 시트 순서번호를 입력하면 된다. |
-----[② RODBC패키지 활용]----- #DB가 엑셀형태인 경우 이용하는 패키지다. DB커넥션을 연결하고, 시트 이름을 입력하고 #다 썼으면 close해줘야 하는 게 특징이다. install.package(RODBC) library(RODBC) db.pointer<- odbcConnectExcel("절대경로+엑셀파일명") excel1 <- sqlFetch(new, "워크시트 이름") close(db.pointer) |
- 그 외에 엑셀을 csv로 저장하여 로드하는 방법도 있다는데, 일반 엑셀에서 csv저장시 형변환이나 데이터
손실이 발생할 수 있으므로 웬만하면 파일 확장자 그대로 이용하는 것을 권고한다.
4. 데이터 저장하기
- 앞서 데이터를 열어봤다면, 조작한 내용을 저장해야 한다.
- 역시나 2가지 방법이 있다.
-----[① writexl 활용]----- install.package("writexl") #역시나 readxl처럼 패키지를 설치해준다. library(writexl) #readxl라이브러리를 사용할 것임을 명시해준다. write_xlsx(excel1,"out.xlsx") # xlsx형태로 잘 저장된다. ![]() |
-----[② write.table 활용]----- write.table(excel1,"out.txt",col.names=T, row.names=T,sep="\t") # excel1의 데이터를 out.txt에 저장하는데 열 이름도 저장하고, 행 이름도 저장한다. # 그리고 각 원소간격을 tab으로 구분한다. # 행, 열 이름은 디폴트로 저장되기 때문에 이름을 지우고 저장하고 싶으면 F로 바꾸면 된다. ![]() write.table(excel1,"out.xlsx") # 이 방법으로도 쓸 수는 있지만 행 단위로만 저장된다(열은 한줄로 묶어져서 저장된다) # 엑셀 이 함수를 이용하지 않는게 낫겠다. |
이상으로 데이터 불러오기 및 저장을 마친다.
'데이터와 AI > R 기초' 카테고리의 다른 글
[R기초-5] Matrix 및 Data Frame의 연산 및 함수 (0) | 2021.01.11 |
---|---|
[R기초-4] Data Frame 생성 및 이용 (0) | 2021.01.08 |
[R기초-3] Matrix란 (0) | 2021.01.07 |
[R기초-2] 벡터의 연산, 함수, 논리값 (0) | 2021.01.03 |
[R기초-1] 벡터의 정의와 함수 (2) | 2020.12.22 |