Search

기초부터 튼튼히

1.
R의 최소 단위는 벡터
R은 스칼라가 없고 최소 단위가 벡터다.
a <- 5 # 라고 하면 스칼라가 아니라 한 개의 값이 있는 벡터다.
R
복사
1-1-1. 객체에 또 다른 객체 넣기
object1 <- 1 object2 <- 2 object1 <- object2 object1 # [1] 2
R
복사
object1에 object2가 들어가는 것이 아니라 object2의 값이 들어가는 것. 예를 들어,
object1 <- 1 object2 <- 2 object1 <- object2 object2 <- 100 object1 # [1] 2
R
복사
출력하기
방식은 print()cat()이 존재한다. print()는 어떠한 R값이든지 출력 형식을 알아서 만들어준다는 점이지만 단점은 오직 하나의 개체만 출력가능하다는 것이다.
cat()은 여러개를 출력할 수 있지만 묶어서 연결된 결과로 출력한다.(각 항목들을 연결할 때 자동으로 빈칸을 삽입한다) ( 줄을 끝내려면 반드시 \n을 넣어줘야 한다)
cat()의 단점은 행렬이나 리스트와 같은 복잡한 구조는 출력하지 못한다는 것이다.
cat("The zero occurs at", 2*pi, "radians", "\n") #The zero occurs at 6.283185 radians fib<-c(0,1,1,2,3,5,8,13,21,34) cat("The first few Fibonacci numbers are:", fib, "...\n") #The first few Fibonacci numbers are: 0 1 1 2 3 5 8 13 21 34 ... cat(list("a","b","c")) #Error in cat(list("a", "b", "c")) : argument 1 (type 'list') cannot be handled by 'cat'
R
복사
변수지정시에 < - 와 동일한 표현은 = , - > 모두 가능하다. (하지만 쓰지는 말자)
foo=3 print(foo) # [1] 3 5->fum print(fum) # [1] 5
R
복사
작업 공간에 저장된 변수와 함수를 확인하고 싶다면 ls() 또는 ls.str() 함수를 사용한다.
ls()함수는 작업공간에 저장된 객체들의 이름을 보여준다.(출력형태는 문자열로 된 벡터다) 만약, 작업 공간에 저장된 객체가 없다면 ls()는 빈 벡터를 반환하고 출력결과는 character(0) 가 나오게 된다.
참고로, ls()는 ‘.’으로 시작하는 이름의 변수는 출력해주지 않는다. all.names=TRUE로 설정하면 이를 추가한 결과를 출력해준다.
ls.str() 함수는 이름 외에도 구조를 출력해준다.
1-1-2. 객체에 함수 넣기
함수를 넣으면 함수가 들어가는 것이 아니라 함수가 처리한 반한된 값이 들어가게 된다.
excel1 <- read.csv("example_studentlist.csv")
R
복사
read.csv() 함수csv포맷의 파일을 읽어들이는 함수다. 데이터프레임을 만들어 excel1이란 객체에 넣어준다.
1-1-3. 벡터에 대해 더 자세히 살펴보기
벡터를 다루는 함수는 c() 다.
객체가 벡터인지 확인할 때는 is.vector(객체) 함수를 사용한다.
a <- c(1,3,5,6,9) is.vector(a) # [1] TRUE a <- 1 # 최소 단위가 벡터이기 때문에 is.vector(a) # [1] TRUE
R
복사
1이라는 단일값을 넣어줘도 벡터라는 것을 확인할 수 있다.
# 문자열도 벡터로 만들 수 있다. a <- c("첫 번째","두 번째","세 번째") a
R
복사
주의할 점은 벡터는 반드시 한가지 데이터 형식만 가진다.
a <- c(1,2,5,"점심") a # 분명 세번째까지는 정수고 네번째는 문자열이지만 결론은 모든 값을 문자열로 바꿔버린다. # [1] "1" "2" "5" "점심"
R
복사
만약, c(,,,)의 인자들 자체가 벡터라면, 하나로 합친 벡터로 만들게 된다
v1<-c(1,2,3) v2<-c(4,5,6) c(v1,v2) # [1] 1 2 3 4 5 6
R
복사
1-1-4. R은 데이터 입력도구가 아니다
R은 데이터를 입력하고 수정하는 일이 아주 힘들다.
확실한 것은 c()함수를 가지고 큰 데이터를 입력하는일은 없다. 또한 c()를 이용해서 값을 추가, 삭제하는 기능도 없다.
물론 할 수도 있으니 일단 설명해보면,
a.
벡터를 추가, 삭제, 수정하기
object1 <- c(1,3,8,9) # 맨끝에 값을 추가하고 싶다면 object1 <- c(object1,11) # 앞에 넣고 싶다면 object1 <- c(1, object1) # 중간에 넣고 싶다면 object1 <- append(object1,99,after=2) # 앞에 두개 뒤의 위치 # 중간 어떤 값을 삭제하고 싶다면 object1 <- object1[-2] # 두번째 위치의 값을 삭제 # 맨 끝 값을 삭제하고 싶다면 object1 <- object1[-length(object1)] # 특정 위치의 값을 바꾸고 싶다면 object1[3] <- 9 # 3번째값을 9로 변경 # 5라는 값을 모두 100으로 바꾸고 싶다면 object1 <- c(1,2,3,1,2,3,1,2,3,5,1,2,3,5,1,2,3) object1 object1[object1 == 5] <- 100 object1
R
복사
1-1-5. 객체 사용 몇 가지 팁
자신이 만든 모든 변수를 확인할때,
ls()
R
복사
좀 더 자세히 알고싶을 때,
ls.str() # 여기서 .str()은 structure를 의미
R
복사
여러 변수를 지우고 싶다면
rm(객체명,객체명2,객체명3)
R
복사
모든 객체를 지우고 싶다면
rm(list=ls())
R
복사
1-1-6. 수열 생성하기
일반적으로는 n:m 표현식으로 1씩 증가하는 간단한 벡터를 만들 수 있다.
1이 아닌 수치로 증가하는 수열을 만들려면 seq함수를 사용한다.
rep함수로 반복되는 벡터도 만들 수 있다.
1:5 #[1] 1 2 3 4 5 seq(from=1,to=5,by=2) #[1] 1 3 5 rep(1, times=5) #[1] 1 1 1 1 1 9:0 #[1] 9 8 7 6 5 4 3 2 1 0 # seq함수는 by말고도 쓸 수 있는 인자들이 있다. length.out은 결과값의 길이다 seq(from=0,to=20,length.out=5) #[1] 0 5 10 15 20 seq(from=0,to=100,length.out=5) [1] 0 25 50 75 100 # seq함수는 실수로 구성된 수열도 만들 수 있다 seq(from=1.0, to=2.0, length=5) #[1] 1.00 1.25 1.50 1.75 2.00
R
복사

1-2. 패키지 - 기능 확장을 선물받음

1-2-1. 패키지 설치방법
먼저 3D 그래프를 보여주는 패키지rgl 패키지를 설치해보자.
install.packages("rgl")
R
복사
1-2-2. 설치된 패키지를 사용하기
설치된 패키지를 사용하려면 로드해야 한다. 콘솔창에 library(rgl)를 실행한다. 또는 require(rgl) 도 된다. 둘의 차이는 크지 않다. 함수 호출 후 Boolean값을 돌려주는 여부만 다르다.
library(rgl)
R
복사
1-2-3. 예제 실행해보기
rgl패키지 안에 있는 plot3d() 함수의 예제코드를 실행시켜보겠다. 예제코드를 바로 실행하는 함수는 example()이다. 이 함수 안에 plot3d함수명을 넣어주면 plot3d 함수의 예제코드가 바로 실행된다.
example(plot3d)
R
복사
패키지 버전 업그레이드는 update.packages(’패키지명’)을 실행하면 업데이트가된다.
1-2-4. 책의 예제를 사용하기 위한 필수 설치 패키지
설치된 패키지를 확인하고 싶다면
library() # 혹은 installed.packages() # 를 사용한다.
R
복사
또는 설치하고 싶은 패키지들만 확인하려고 한다면 다음과 같이 할 수도 있다.
c("ggplot2","ggthemes","data.table","devtools","dplr","plyr","reshape2","scales","stringr")%in% installed.packages()[,"Package"] # [1] TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE
R
복사
결과를 확인해보면 ggthemes, dplyr 가 설치되어있지 않다.
install.packages("ggthemes") install.packages("dplyr")
R
복사
패키지의 버전 정보를 확인하고 싶을 경우
installed.packages()[,c("Package","Version")]
R
복사
1-3. 검색 방법 추진
R과 관련된 정보들을 배울 수 있다. http://rseek.org
1-3-2 Reference 문서를 참고
http://cran.r-project.org/manuals.html
사실상 이 문서는 R을 설치할 때 doc 폴더에 함께 저장된다.
1-3-3 R에서 직접 도움말 보기
문서를 찾지 않아도 help()함수를 사용하면 함수에 대한 도움말을 볼 수 있다.
help(”알고싶은함수명”)
help("rep") # 또는 ?rep
R
복사
물론, 패키지를 당연히 로드하지 않으면 도움말이 나오지 않는다.
하지만, 패키지를 로드하지 않고도 볼 수 있는 방법이 있다.
# :: 기호를 사용하면 해당 패키지를 로드하지 않고도 사용할 수 있다. ?ggplot2::gplot
R
복사

1-4 입력과 출력

1-4-1 출력을 파일에 쓰기
sink(”파일이름”) : console창 대신 파일에 결과값을 출력해서 보여줌. 파일은 워킹 디렉토리에 저장된다.
sink("output.txt") x<-1 y<-2 x+y sink() # 반드시 써줘야 다시 console창으로 돌아온다.
R
복사
cat() : cat()함수는 print()함수와 다르게 file인자를 활용하면 파일로 출력을 리디렉션할 수 있다. (파일 하나에 계속 출력값을 이어가고 싶다면 cat 인자인 append=True를 넣어준다)
cat(data, file="analysisReport.out") cat(results, file="analysisReport.out", append=True) cat(conclusion, file="analysisReport.out", append=True)
R
복사
단, 위의 방식은 할때마다 번거롭다. 따라서 맨 처음 파일을 열고 닫고하는 방식이 더 쉽다. 코드는 아래와 같다.
file(”파일이름”, “w”) : 해당 파일을 만들고 출력을 적기, 종료할때는 close(file을 받는 변수이름) 을 꼭 해준다.
con<-file("analysisReport.out","w") # 파일열기 cat(data, file=con) cat(results, file=con) cat(conclusion, file=con) close(con) # 파일 닫기
R
복사
1-4-2 파일 목록 보기
list.files() : 워킹 디렉토리에 저장되어 있는 파일 목록
list.files(all.files=TRUE) : 숨겨진 파일까지 모두 보기
1-4-3 고정폭 레코드 읽기
데이터 항목들의 경계가 고정되어 있는 고정폭 레코드에서 데이터를 읽을 경우다.
a.
우선 열의 너비를 알아야 한다.
b.
각 열 사이의 폭도 확인한다.
read.fwf(”파일이름”, widths=c(w1,w2,...)) : 인자는 파일이름과 필드의 너비다. 결과는 데이터프레임이다.
참고로 read.table로 읽어오는 것처럼 마음대로 열이름을 할당하는데 열 이름을 바꾸려면
col.names 인자를 사용한다.
수치가 아닌 데이터를 자동으로 요인으로 처리한다. 문자로 처리하고 싶다면 읽을 때 stringsAsFactors=FALSE 로 설정한다.
records <-read.fwf("fixed-width.txt", widths=c(10,10,4,-1,4)) # widths는 각 열마다 몇 개의 너비로 되어있는지 적어주는데,이때, 음수는 양쪽 열의 # 공백 수를 의미한다. 즉 위의 데이터는 총 4개의 열로 되어있다. # 열 이름을 바꾸기 위해 col.names 인자를 사용한다 records <-read.fwf("fixed-width.txt", widths=c(10,10,4,-1,4), col.names=c("Last","First","Born","Died"))
R
복사
1-4-4 csv 포맷 읽어들이기
가장 좋은 방법은 csv파일(쉼표로 구분된 파일)을 가져오는 것이다. read.csv()함수를 이용하면 된다. 물론 해당 파일이 작업 디렉토리에 있어야 한다.
List <- read.csv("R까기2_예제파일_전체/example_studentlist.csv") List
R
복사
유의할 점은 첫번째 행이 변수를 포함하는 행인지의 여부다. 이를 header라고 부르는데, read.csv는 기본으로 첫번째 행이 변수행의 이름으로 인식하도록되어있다. ( read.table)
만약, csv파일에 변수이름이 없다면 header인자를 FALSE로 지정해줘야한다.
read.table, read.fwf와 마찬가지로 비수치형 데이터(즉, 문자형)를 요인으로 자동처리 한다. 문자열로 해석되게 처리할 경우 다만 as.is = TRUE 인자를 설정해준다는 점이 다르다.
read.table 함수와 동일하게 주석처리된 라인은 무시할 수 있다.
1-4-5 txt 포맷을 다양한 방법으로 읽어들이기
대표적으로 read.table() 함수가 있다. 이는 엑셀과는 다르게 셀의 구분이 어떻게 되어있는지 한눈에 알기 어렵다. 하지만 대부분 txt파일은 tab으로 구분하는 경우가 많다. (그 외로는 공백, 쉼표, ; 와 같은 한 글 짜리 구분 문자가 있다)
sep 인자는 default가 공백또는 tab 이다.
이파일 역시 작업 디렉토리와 같은 디렉토리에 있어야 한다.
read.fwf 와 동일하게 문자열 데이터는 자동으로 요인으로 처리한다. stringsAsFactors=FALSE 인자를 지정해서 문자로 처리할 수 있다.
데이터에서 결측값을 NA가 아닌 다른 문자열로 표현하는 경우 na.strings인자로 결측값이 어떻게 표현되어 있는지를 지정해줘야 한다. read.table은 NA만 자동으로 결측값으로 처리하기 때문이다.
List<- read.table("R까기2_예제파일_전체/studentlist.txt") List
R
복사
유의할 점은 read.table()은 header인자의 기본값이 FALSE라는 것이다. 따라서 변수명이 데이터 파일에 들어있다면 header=TRUE로 지정을 해줘야 한다.
List<- read.table("R까기2_예제파일_전체/studentlist.txt",header=TRUE)
R
복사
구분기호는 tab 말고도 다른 구분인자로 되어있을 수도 있다. 이는 sep인자로 지정해준다.
만약 ‘;’ 기호로 값들이 구분되어있다면
List<- read.table("R까기2_예제파일_전체/studentlist2.txt",header=TRUE,sep=';')
R
복사
dfrm <-read.table("filename.txt", na.strings=".")
R
복사
read.table은 ‘주석 라인’을 처리할 수 있다. 데이터 파일에 #로 주석처리가 되어있는 부분은 무시된다. 즉, 데이터파일에 설명을 주석처리로 달 수 있다는 얘기다.
1-4-6 excel 파일 읽어들이기
readxl 패키지다. 파일명과 sheet명만 넣으면 된다.
install.packages("readxl") library(readxl) DF <- read_excel(path="R까기2_예제파일_전체/studentlist.xlsx", sheet="Sheet1", col_names=TRUE) DF
R
복사
하지만, 가급적 csv파일을 사용하는 것이 좋다.
1-4-7 SPSS 파일인 sav 포맷 읽어들이기
써야할 패키지는 foreign 패키지다. 이 패키지에는 read.spss() 함수가 있고 이를 sav 파일을 읽는데 사용한다.
library(foreign) Score <- read.spss("R까기2_예제파일_전체/score.sav") Score
R
복사
spss를 읽어들인 형태는 해석하기 어렵다. 따라서 데이터프레임으로 보통 바꾼다.
class(Score) # [1] "list"
R
복사
class를 확인해보면 list type이다. as.data.frame() 함수를 이용해서 데이터 프레임 형식으로 바꿔준다.
Score <- as.data.frame(Score) Score # ID Score # 1 1 80 # 2 2 90 # 3 3 100
R
복사
1-4-8 XML 포맷 읽어들이기
우리가 흔히 보는 웹페이지가 XML 포맷이다. 먼저 XML 패키지를 설치한 다음,
install.packages("XML") library(XML)
R
복사
ERROR 발생 시
패키지를 설치할 때, failed to lock directory 라고 에러가 발생하면서 설치가 안될때, 다음과 같이 해결한다.
install.packages("설치하고싶은 패키지 이름", dependencies=TRUE, INSTALL_opts = "--no-lock")
R
복사
또는, 이래도 해결이 안될때는
ERROR: failed to lock directory ‘C:\R\R-4.1.1\library’ for modifying Try removing ‘C:\R\R-4.1.1\library/00LOCK’
이 에러의 말처럼 해당 디렉토리로 가서 00L0CK 파일을 지운다.
xml 파일을 불러오기 위해서는 XML패키지에 있는 xmlTreeParse() 를 이용한다.
DocFromXML <- xmlTreeParse("R까기2_예제파일_전체/score.xml", useInternal=T)
R
복사
useInternal=True는 일단 외우자. 필요없는 태그는 빼고 필요한 컨텐츠만 가져오려면 xmlRoot() 를 사용한다.
RootNode<- xmlRoot(DocFromXML) RootNode
R
복사
여기에서 name과 score 값을 가져오는 방법을 살펴보자.
Names <- xpathSApply(RootNode,"//name",xmlValue) Names # [1] "Peter" "Abel" "Elin" Scores <- xpathSApply(RootNode,"//score",xmlValue) Scores # [1] "100" "90" "80"
R
복사
이제, 이 두값을 테이블로 만들기 위해 data.frame() 을 이용한다.
MathScore <- data.frame(NAME=Names, SCORE=Scores) MathScore #NAME SCORE #1 Peter 100 #2 Abel 90 #3 Elin 80
R
복사
data.frame() 과 as.data.frame() 의 차이는??
이 둘의 차이는 data.frame() can be used to build a data frame while as.data.frame() can only be used to coerce other object to a data frame.
즉, as.data.frame()은 다른 형태인 객체를 데이터 프레임형태로 강제로 바꿀때 사용하는 것.
1-4-9. ctrl + c, ctrl + v 로 데이터 가져오기
간단한 데이터인 경우에 ctrl + c , ctrl + v를 통해서 외부 데이터를 가져오는 방법이 있다. 엑셀에서 영역을 선택한 후 ctrl + c 를 한다. 그리고 R로 와서 다음과 같이 입력한다.
StudentList <- read.delim("clipboard")
R
복사
위는 클립보드에 있는 데이터를 불러들인다. header를 자동으로 인식한다. (read.csv()와 동일)
1-4-10. csv 파일로 쓰기
행렬이나 데이터 프레임을 csv파일로 저장하기 위해서 쓴다.
write.csv(x, file=”파일이름”, row.names=TRUE, col.names=TRUE) : col.names=TRUE이기 때문에 열의 이름을 나타내는 헤더라인도 데이터의 한 부분으로 저장한다. row.names=TRUE이기 때문에 행의 라벨에 대한 데이터를 생성해서 같이 저장한다. 일반적으로는 row.names=FALSE로 지정한다.
주석 라인은 추가할 수 없다.
만약, 다른 형식으로 저장하고 싶다면 write.table 함수를 사용하면 된다.
1-4-11. 웹에서 테이블 혹은 csv데이터 읽어오기
단지, 파일이름 대신에 url을 넣어주면 된다.
tbl <- read.csv("http://www.example/com/download/data.csv")
R
복사
1-4-12. html 테이블에서 데이터 읽어오기
웹에 있는 html로 된 테이블에서 데이터를 읽어오고 싶다면 XML패키지readHTMLTable 함수를 사용한다.
library(XML) url <- 'http://www.example.com/data/table.html' tbls <- readHTMLTable(url) # 페이지에 있는 모든 테이블 읽기 tbl <-readHTMLTable(url, which=3) # 페이지에 있는 3번째 테이블 읽기 # world population이라는 위키피디아 페이지의 모든 테이블 로딩 url <-'https://en.wikipedia.org/wiki/World_population' tbls <- readHTMLTable(url) length(tbls) # 총 로딩한 테이블의 수를 확인 tbl <- readHTMLTable(url, which=3) # 인구가 많은 국가 목록의 테이블 tbl[,c(2,3)] # 로딩한 테이블에서 국가이름과 인구열만 추출
R
복사
html 은 그다지 유용하지 않다. 불러오고 처리해야할 것들이 많기 때문이다. 왠만하면 xml, json, csv로 받아오는 것이 좋다.
1-4-13. 복잡한 구조를 가진 파일 읽기
readLines() : 개별 라인을 읽는다. 한 줄이 하나의 문자열로 처리한다.
scan() : 파일의 내용을 토큰 스트림으로 읽고 what인자로 데이터의 유형을 지정한다. 토큰을 데이터로 변환하고 데이터를 모아 레코드로 만들 수 있다.
왼쪽에서 오른쪽으로 읽는다 !
scan("파일이름") # 일반적으로 숫자 형태일 때는 이렇게 불러들인다. scan("파일이름", what="") # 데이터가 문자 형태라면 이렇게 불러들인다. scan("파일이름",sep="\n") # 문장의 끝을 구분할 기준값을 sep인자로 설정할 수 있다. # 당연히 default는 공백 또는 tab이다. scan("파일이름", skip=2) # 제외할 최대 행의 수를 의미한다. 3번째행부터 읽어들인다. scan("파일이름", nlines=2) # 읽어들일 최대 행의 수를 의미한다. 2번째까지 행만 읽어들인다. scan("파일이름", na.strings=".") # 결측값으로 인식할 데이터의 형태를 의미한다.
R
복사
scan은 여러 유형의 토큰을 포함하는 목록을 읽어들일 수도 있다.
# 토큰 세 개짜리 데이터가 들어온다고 해보자. 이때, 토큰으로 리스트를 사용한다. triples <- scan("triples.txt",what=list(character(0),numeric(0),numeric(0)) # 문자, 숫자, 숫자형태를 가지는 데이터를 읽어들였다. # 이름도 부여할 수 있다. triples <- scan("triples.txt",what=list(date=character(0),high=numeric(0),low=numeric(0)) # 다음과 같이 응용할 수 있다. wor
R
복사
lines <- readLines("input.txt") lines <- readLines("input.txt", n=10) # 읽어올 라인의 최대 수를 n으로 지정한다.
R
복사
1-4-14. MySQL 데이터베이스에서 읽어오기
1.
RMySQL 패키지를 설치한다.
2.
dbConnect 함수를 사용해서 데이터베이스 연결을 연다.
3.
dbGetQuery로 SELECT를 시작하고 결과 세트를 반환한다.
4.
끝나면 dbDisconnect를 사용해서 데이터베이스 연결을 종료한다.
1-4-15. 객체를 저장하고 전송하기
하나 혹은 그 이상의 R객체를 파일에 저장했다가 나중에 사용하거나 R객체를 한 컴퓨터에서 다른 컴퓨터로 복사하고 싶을 경우가 있다. save는 파일로 객체를 저장하여 컴퓨터들에 옮길 수 있게 해주고, load로는 이런 파일들을 읽을 수 있다.
save(mydata, file=”myData.RData”) : 바이너리 데이터를 작성한다.
load(”myData.RData”)
1-6 알아두면 유용한 몇 가지 팁
가끔 install.packages로 설치할 수 없는 패키지가 있다. 개발자 버전인 경우가 그 예인데, 개발자가 Github에 공개하는 경우도 있기 때문에, Github를 통해 패키지를 설치하는 방법을 살펴보겠다.
먼저 아래 패키지를 설치하고
install.packages("devtools") library(devtools)
R
복사
Github 내 설치할 패키지 사이트로 간다. 예를들어 https://github.com/yihui/knitr 과 같다. 그런 다음, yihui/knitr 만 복사해 다음과 같이 입력한다.
install_github("yihui/knitr")
R
복사
1-6-2 자주쓰는 명령어 계속 쓰기 귀찮아
R에는 스크립트라는 파일을 만들 수 있다. Ctrl + shift + N 을 누르면 된다. 그런데, 사실상 이미 쓰고 있는 경우가 더 많고, 메모장 정도라고 생각하면 된다.