R과 데이터분석 R 데이터 양창모 청주교육대학교 컴퓨터교육과 2015년 겨울 R에서 지원하는 데이터 타입 I R에서는 일반적인 프로그래밍 언어에서 흔히 사용되는 정수, 부동소수, 문자열이 기본적으로 지원된다. I 그외에도 자료처리에 적합한 자료구조인 벡터vector, 행렬matrix, 데이터 프레임data frame, 리스트list 등이 있다. R에서 지원하는 데이터 타입 변수 variable I R의 변수명은 알파벳, 숫자, _,. 로 구성되며 I 첫 글자는 알파벳 또는. 으로 시작해야한다. I. 으로 시작하면 뒤에는 숫자가 올 수 없다. I 변수에 값을 할당할때는 < 또는 << 또는 = 를 사용한다.
R 의기본형은벡터이므로이들스칼라자료는길이 1 의벡터로볼수 있다. 숫자 정수, 실수등 > a <- 3 > b <- 4.5 > c <- a + b > print(c) [1] 7.5 NA 데이터에값이존재하지않는다면 NA 로표시 어떤변수에 NA 가저장되어있는지는 is.na() 함수로확인 > one <- 100 > two <- 75 > three <- 80 > four <- NA > is.na(four) [1] TRUE 문자열 character string this is string 또는 "this is string" 과같이어느따옴표로묶인것 > a <- "hello" > print(a) [1] "hello"
진리값 truth value TRUE, T 는모두참값을말한다. FALSE, F 는거짓을말한다. 진리값에는 &(AND), (OR),! (NOT) 연산자를사용할수있다. > TRUE & TRUE [1] TRUE > TRUE & FALSE [1] FALSE > TRUE TRUE [1] TRUE > TRUE FALSE [1] TRUE >!TRUE [1] FALSE >!FALSE [1] TRUE 진리값 truth value 밀히말하면 TRUE 와 FALSE 는예약어 reserved words 즉, 상수 값이며 T, F 는각각 TRUE 와 FALSE 로초기화된전역변수 T 에 FALSE 를할당하는것이가능하지만 TRUE 에는 FALSE 를 할당할수없다. > T <- FALSE > TRUE <- FALSE Error in TRUE <- FALSE :... 진리값 truth value AND 나 OR 연산자에는 &, 외에도 && 와 가있다. &, 는부울값이저장된벡터끼리의연산시각원소간계산을 한다는점이다. &&, 는하나의부울값끼리연산을한다. > c(true, TRUE) & c(true, FALSE) [1] TRUE FALSE Factor 범주형 Categorical 변수를위한데이터타입 > sex <- factor("m", c("m", "f")) # > sex [1] m Levels: m f sex 변수는 "m" 또는 "f" 값을갖는범주형변수로 "m" 을값으로 갖는다.
Factor Factor 변수는 nlevels() 로범주의수를구할수있고, levels() 로범주목록을알수있다. > nlevels(sex) [1] 2 > levels(sex) [1] "m" "f" Factor 이를응용하면각범주의값을다음과같이구할수있다. R 에서색인은 0 이아니라 1 부터시작한다. > levels(sex)[1] [1] "m" > levels(sex)[2] [1] "f" Factor Factor 변수에서 level 의값을직접적으로수정하고자한다면 levels() 에값을할당하면된다. 다음예는 "m" 을 "male", "f" 를 "female" 로바꾼다. > sex [1] m Levels: m f > levels(sex) <- c( male, female ) > sex [1] male Levels: male female Factor factor() 는기본적으로데이터에순서가없는명목형 nominal 변수를만든다. 만약범주형데이터지만 " 나쁨 ", " 조금나쁨 ", " 보통 ", " 조금 좋음 ", " 아주좋음 " 등과같이순서가있는값일경우는 순서형 ordinal 변수로만들기위해 ordered() 를사용하거나 factor() 를호출할때 ordered=true 를지정해준다. > ordered(c("a", "b", "c")) [1] a b c Levels: a < b < c > factor(c("a", "b", "c"), ordered=true) [1] a b c Levels: a < b < c
Factor 벡터는중첩될수없다. 따라서벡터안에벡터를정의하면이는 단일차원의벡터로변경된다. 중첩된구조가필요하다면뒤에서다룰리스트 List 를 사용해야한다. > c(1, 2, 3) [1] 1 2 3 > c(1, 2, 3, c(1, 2, 3)) [1] 1 2 3 1 2 3 정의 동일한종류의값의모임인배열 array c() 안에원하는인자들을나열하여정의한다. > x <- c(1, 2, 3, 4, 5) > x [1] 1 2 3 4 5 인자들은동일한스칼라타입이어야한다. 만약다른타입의데이터를섞어서벡터에저장하면이들 데이터는한가지타입으로자동형변환된다. > x <- c("1", 2, "3") > x [1] "1" "2" "3" 정의 숫자형데이터의경우 start:end 형태로 start 값부터 end 값까지의값을갖는벡터를만들수있다. seq(from, to, by) 또는 seq(from, to ) 형태역시가능하다. > x <- 1:10 >x [1] 1 2 3 4 5 6 7 8 9 10 > x <- 5:10 > x [1] 5 6 7 8 9 10 > seq(1, 10, 2) [1] 1 3 5 7 9 > seq(1, 5, 2) [1] 1 3 5 정의 특정값들이반복된벡터를손쉽게만드려면 rep() 를 사용한다. > rep (1:2, 5) [1] 1 2 1 2 1 2 1 2 1 2 > rep (1:2, each =5) [1] 1 1 1 1 1 2 2 2 2 2
정의 seq_along() 은인자로주어진데이터의길이만큼 1, 2, 3,, N 으로구성된벡터를반환한다. seq_len() 은 N 개의값이인자로주어지면 1, 2, 3,, N 으로구성된벡터를반환한다. > seq_along(c("a", "b", "c")) [1] 1 2 3 > seq_len(3) [1] 1 2 3 정의 names() 에원하는이름을벡터로넘겨서벡터의각셀에 이름을붙일수있다. > x <- c(1, 3, 4) > names(x) <- c("kim", "seo", "park") >x kim seo park 1 3 4 데이터접근 대괄호 [ ] 안에인덱스를적어원소에접근한다. 인덱스는 1 로시작한다. > x <- c("a", "b", "c") > x[1] [1] "a" > x[3] [1] "c" 데이터접근 인덱스를음수로지정하여배제한다. > x <- c("a", "b", "c") > x[-1] [1] "b" "c" > x[-2] [1] "a" "c"
데이터접근 벡터의여러위치에저장된값을가져오려면인덱스를벡터 형식을사용한다. 인덱스는 1 로시작한다. > x <- c("a", "b", "c") > x[c(1, 2)] [1] "a" "b" > x[c(1, 3)] [1] "a" "c" 데이터접근 인덱스의형식을 start:end로지정하여 start 부터 end까지의원소에접근한다. > x <- c("a", "b", "c") > x[1:2] [1] "a" "b" > x[1:3] [1] "a" "b" "c" 데이터접근 셀에이름을붙였다면이름을사용하여원소에접근할수있다. > x <- c(1, 3, 4) > names(x) <- c("kim", "seo", "park") > x kim seo park 1 3 4 > x["seo"] seo 3 > x[c("seo", "park")] seo park 3 4 데이터접근 벡터에부여된이름만보려면 names() 를사용한다. > names(x)[2] [1] "seo" 벡터의길이는 length() 를사용하여얻는다. > x <- c("a", "b", "c") > length(x) [1] 3
연산 %in% 연산자는어떤값이벡터에포함되어있는지를알려준다. > "a" %in% c("a", "b", "c") [1] TRUE > "d" %in% c("a", "b", "c") [1] FALSE 연산 벡터를집합set으로취급해집합간합집합, 교집합, 차집합을계산할수있다. > setdiff(c("a", "b", "c"), c("a", "d")) [1] "b" "c" > union(c("a", "b", "c"), c("a", "d")) [1] "a" "b" "c" "d" > intersect(c("a", "b", "c"), c("a", "d")) [1] "a" 연산 집합간비교는 setequal() 을사용한다. > setequal(c("a", "b", "c"), c("a", "d")) [1] FALSE > setequal(c("a", "b", "c"), c("a", "b", "c", "c")) [1] TRUE 리스트 list (key, value) 형태의데이터를담는연관배열 associative array 이다. list((key, value) 형태로데이터를나열하여정의한다. > x <- list(name="foo", height=70) > x $name [1] "foo" $height [1] 70
리스트 list 정의 이때각값이반드시스칼라일필요는없다. 다음처럼벡터를저장할수도있다. > x <- list(name="foo", height=c(1, 3, 5)) > x $name [1] "foo" $height [1] 1 3 5 리스트 list 정의 리스트에는다양한값들을혼합해서저장할수있다. 따라서리스트안에리스트를중첩하는것이가능하다. > list(a=list(val=c(1, 2, 3)), b=list(val=c(1, 2, 3, 4))) $a $a$val [1] 1 2 3 $b $b$val [1] 1 2 3 4 리스트 list 데이터접근 list$key 형식으로원소에접근한다. 또는 list[[index]] 형식으로원소의에접근한다. > x <- list(name="foo", height=c(1, 3, 5)) > x$name [1] "foo" > x$height [1] 1 3 5 > x[[1]] [1] "foo" > x[[2]] [1] 1 3 5 리스트 list 데이터접근 list[index] 형식으로원소에접근하면 (key, value) 를담고있는리스트를반환한다. > x[1] $name [1] "foo" > x[2] $height [1] 1 3 5
행렬 matrix 정의 차원 dimension 속성을갖는벡터 matrix() 함수로행렬을만든다. 차원속성은길이가 2 인정수벡터 (nrow 와 ncol) > m<-matrix(nrow=2, ncol=3) > m [,1] [,2] [,3] [1,] NA NA NA [2,] NA NA NA im(m) [1] 2 3 행렬 matrix matrix() 함수의첫인수로행렬원소값을지정한다. > m<-matrix(1:6, nrow=2, ncol=3) > m [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 행렬 matrix dim 속성에차원정보 ( 벡터형식 ) 를추가하여행렬로만들수있다. > m <- 1:10 > m [1] 1 2 3 4 5 6 7 8 9 10 im(m)<-c(2,5) > m [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 행렬 matrix 열단위로벡터를지정하여 (cbind() 함수 ) 행렬을만들수있다. > x<-1:3 > y<-10:12 > cbind(x,y) x y [1,] 1 10 [2,] 2 11 [3,] 3 12
행렬 matrix 행단위로벡터를지정하여 (rbind() 함수 ) 행렬을만들수있다. > x<-1:3 > y<-10:12 > rbind(x,y) [,1] [,2] [,3] x 1 2 3 y 10 11 12 데이터프레임은 R에서가장중요한자료형이다. 데이터프레임은행렬과마찬가지의모습을하고있지만 행렬과달리다양한변수, 관측치observations, 범주등을표현하기위해특화되어있다. row.names 속성을갖는다. read.table() 또는 read.csv() 함수를사용하여만든다. data.matrix() 함수를사용하여행렬로부터만든다. 속성을갖는다. 정의 data.frame() 함수를사용하여정의한다. <-data.frame(c(1,2),c("x","y"),c("m","f")) c.1..2. c..x...y.. c..m...f.. 1 1 x M 2 2 y F rownames() 함수와 rcolnames() 함수를사용하여데이터 프레임의행과열의이름을지정한다. > colnames(d) <- c("x","y","z") > rownames(d) <- c("n1","n2") x y z n1 1 x M n2 2 y F
정의 행렬로부터데이터프레임을만들수있다. > m [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 > md <- data.frame(m) > md X1 X2 X3 X4 X5 1 1 3 5 7 9 2 2 4 6 8 10 정의 data.frame() 함수를사용하여정의한다. 데이터프레임을만들때열의이름을지정하는것이일반적이다. <-data.frame(x=c(1,2),y=c("x","y"),z=c("m","f")) x y z 1 1 x M 2 2 y F str() 함수를사용하여데이터프레임의구조를볼수있다. > str(d) data.frame : 2 obs. of 3 variables: $ x: num 1 2 $ y: Factor w/ 2 levels "x","y": 1 2 $ z: Factor w/ 2 levels "F","M": 2 1 원소선택 $ 기호와열의이름을사용하여데이터프레임의열을선택할수있다. $x [1] 1 2 $x <-10:11 $y <- c("a", "b") x y z 1 10 a M 2 11 b F
원소선택 $ 기호와열의이름을사용하여데이터프레임의열을선택할수있다. [,c("x","w")] x w n1 1 100 n2 2 200 원소선택 위치인덱스를벡터로사용하여데이터프레임의행또는열을선택할수있다. x y z w n1 1 x M 100 n2 2 y F 200 [1,] x y z w n1 1 x M 100 [,1] [1] 1 2 원소선택 위치인덱스를벡터로사용하여데이터프레임의행또는열을선택할수있다. x y z w n1 1 x M 100 n2 2 y F 200 [,c(2,3)] y z n1 x M n2 y F 원소선택 - 기호를사용하여제외할행또는열의인덱스를지정할수있다. x y z w n1 1 x M 100 n2 2 y F 200 [-1,c(-2,-3)] x w n2 2 200
$ 기호를사용하여새로운열을추가할수있다. $w <- c(100,200) x y z w 1 10 a M 100 2 11 b F 200 data.frame() 함수를사용하여새로운열을추가할수있다. <- data.frame(d, w=c(100,200)) 데이터프레임의행인덱스를사용하여행을추가할수있다. > md X1 X2 X3 X4 X5 1 1 3 5 7 9 2 2 4 6 8 10 > md[3,] X1 X2 X3 X4 X5 NA NA NA NA NA NA > md[3,]=c(11,12,13,14,15) > md X1 X2 X3 X4 X5 1 1 3 5 7 9 2 2 4 6 8 10 3 11 12 13 14 15