본문 바로가기

[2016 - 2019] 학부 정리/4학년

[4학년 - 빅데이터기술] R프로그래밍

[데이터 타입] 

변수, 스칼라, 벡터, 리스트, 행렬, 배열, 타입판별, 타입변환


1. 변수

 1) 기초 데이터 타입

  - integer :  정수

  - numeric : 실수

  - character : 문자열

  - logical : 논리형(부울형)

  - complex : 복소수


 2) 복합 데이터 구조 타입

  - 벡터(vector)

  - 행렬(matrix)

  - 데이터프레임(data frame)

  - 리스트(list)


2. 스칼라 

 1) 정수, 부동 소수 모두 지원

  > a<-2

  > b<-2.7

  > c<-a+b

  > c

 

 2) NA(결측치) : 값이 존재하지 않음

  > one <- 100

  > two <- 75

  > three <- 80

  > four <- NA

  > is.na(four)  #결측치인지 확인

   [1] TRUE


 3) NULL : 변수가 초기화 되지 않은 경우

  > x <- NULL  #대분자로 써야하며 NA와 구분

  > is.null(x)     #null값인지 확인


 4) 문자열

  > a <- "hello" # 'hello'가능

  > print(a)

   [1] "hello"


 5) 진리값

  > TRUE & TRUE

   [1] TRUE

  > TRUE | FALSE

   [1] TRUE


 6) 요인(Factor) : 범주형 데이터

  > gen <- factor("m", c("m","f")) #gen라는 변수를 출력해보니 값은 m, 이 변수가 가질 수 있는 수준은 m과 f 2개이다.

  > gen

   [1] m

   Levels: m f

 factor()라는 범주형 함수가 호출되고, factor()안에 주어진 첫번째 인자는 gen변수에 저장되는 값이다. 그리고 이 범주형 변수는   c('m','f')에 표현된 바와 같이 2개의 m과 f가 가능하다. 즉 m과 g중 m이 선택되어 gen에 저장된것.


  > gen<-factor('g', c('m','f','g'))

  > gen

   [1] g

   Levels: m f g 


  > gen <- factor(c('f','m','f','g'))

  > gen

   [1] f m f g

   Levels: f g m  #알아서 순서대로 나온다. 중복된 값이 있을 경우 값을 선택하여 저장 할 수 없다.


  > nlevels(gen) #levels의 갯수

   [1] 3

  > levels(gen)

   [1] "f" "g" "m"

  

  # levels를 직접 바꾸기

  > levels ( gen ) <- c ('male ', 'female ') 

  > gen [1] male Levels : male female


  #순서형 변수로 만들어 주기위해서는 ordered=TRUE를 붙여주거나 ordered()를 사용한다.

  > ordered(c('b','a','c'))

   [1] b a c

   Levels: a < b < c

  > factor(c('b','a','c'),ordered=TRUE)

   [1] b a c

   Levels: a < b < c


  

3. 벡터(vector) : 배열과 유사, 한가지 타입의 데이터가 순서대로 저장

  ###정의

  # 자동형변환, 숫자 -> 문자

  # 벡터 중첩 : 벡터안에 벡터를 정의하면 단일 차원의 벡터로 변경

  > c(1,2,3,c(1,2,3))

   [1] 1 2 3 1 2 3

  # 숫자형은 start:end구조 가능

  > x <- 1:10

  > x

   [1]  1  2  3  4  5  6  7  8  9 10

  # seq(from, to, by)형태 가능

  > seq(1,10,2)

   [1] 1 3 5 7 9 #홀수

  > seq(2,10,2)

   [1]  2  4  6  8 10 #짝수

  # names() 벡터의 각 셀에 이름을 부여할 수 있다.

  > x <- c(1,3,4)

  > names(x) <- c("kim", "lee", "park")

  > x

    kim  lee park 

      1    3    4 

  


  ###벡터내 데이터 접근

  > x<-c("a","b","c","e","d")

  > x

   [1] "a" "b" "c" "e" "d"

  #2번째 원소 출력(1,2,3... 순서임!)

  > x[2]  

   [1] "b"   

  #3번째 원소 빼고출력

  > x[-3]    

   [1] "a" "b" "e" "d"

  #1,3,5번 원소 출력

  > x[c(1,3,5)]       

   [1] "a" "c" "d"

  #1~4까지 원소 출력

  > x[1:4]    

   [1] "a" "b" "c" "e"

  #이름부여

  > x<-c(1,3,4)

  > names(x) <- c('kim','lee','park')

  > x

    kim  lee park 

      1    3    4 

  #lee요소만 출력

  > x['lee']

   lee 

     3 

  #kim, lee 요소만 출력

  > x[c('kim','lee')]

   kim lee 

     1   3 

  #이런건 없음..

  > x[-'park']

   Error in -"park" : invalid argument to unary operator

  #이렇게 순서를 적으면 3번째 요소 빼고 출력

  > x[-3]

   kim lee 

     1   3 

  #벡터 길이 출력

  > x <- c("a","b","c")

  > length(x)

   [1] 3

  # 행렬에서만 가능한 행의 수 출력

  > nrow(x)

   NULL

  # 대문자!!!! 행렬, 벡터에서 모두 가능한 행의 수 출력, 벡터에서는 n행 1열로 생각해서 출력한다.

  > NROW(x)

   [1] 3

  


  ###벡터의 연산

  # %in% 문자가 포함되어 있는지

  > "a" %in% c("b","a","c")    #a라는 문자가 벡터에 포함되어 있는지

   [1] TRUE

  > "d" %in% c("b","a","c")

   [1] FALSE

  ##집합연산

  #차집합

  > 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(c("a","b","c"), c("a","d"))

   [1] FALSE

  > setequal(c("a","b","c"), c("a","b","c","c"))

   [1] TRUE

  #rep함수 - rep(from, to, 반복횟수)

  > rep(1:2, 3)

   [1] 1 2 1 2 1 2

  #each=3 각각 반복

  > rep(1:2, each=3)

   [1] 1 1 1 2 2 2


4. 리스트 : 서로 다른 데이터 타입 저장 가능, (키, 값)형태, (키=값, 키=값,...)

  #(키, 값)형태의 데이터

  > x<-list(name="foo", height=70)

  > x

   $name

   [1] "foo"


   $height

   [1] 70


  > x<-list(name="foo", height=c(1,2,4))

  > x

   $name

   [1] "foo"


   $height

   [1] 1 2 4


  #리스트내의 리스트

  > 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


  #리스트내의 데이터 접근(x$key,  x[index],  x[[index]])

  > x <- list(name="lee", height=c(3,4,5))

  > x

   $name

   [1] "lee"


   $height

   [1] 3 4 5

  #key를 이용한 접근

  > x$name

   [1] "lee"

  > x$height

   [1] 3 4 5

  # 값이 아니라 1개의 원소를 갖는 서브리스트 반환

  > x[1]

   $name

   [1] "lee"

  # 값을 가져오기 위한 형태

  > x[[2]]

   [1] 3 4 5


5. 행렬 : 2차원 벡터, 원소의 타입이 동일 데이터 형

  ### 행렬 만들기

  > matrix(c(1,2,3,4,5,6,7,8,9), nrow=3)

        [,1] [,2] [,3]

   [1,]    1    4    7

   [2,]    2    5    8

   [3,]    3    6    9

  > matrix(c(1,2,3,4,5,6,7,8,9), ncol=3)

        [,1] [,2] [,3]

   [1,]    1    4    7

   [2,]    2    5    8

   [3,]    3    6    9

 #행별로 순서가 정해지게 

  > matrix(c(1,2,3,4,5,6,7,8,9), nrow=3, byrow=T)

        [,1] [,2] [,3]

   [1,]    1    2    3

   [2,]    4    5    6

   [3,]    7    8    9

 #행렬에 이름 붙이는 방법(1), 한번에

  > matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3, dimnames=list(c("item1","item2","item3"),c("feature1","feature2","feature3")))

         feature1 feature2 feature3

   item1        1        4        7

   item2        2        5        8

   item3        3        6        9

 #행렬에 이름붙이는 방법(2), 따로따로

  > x <- matrix(c(1,2,3,4,5,6,7,8,9), nrow=3)

  > x

        [,1] [,2] [,3]

   [1,]    1    4    7

   [2,]    2    5    8

   [3,]    3    6    9

  > rownames(x) <- c('r1','r2','r3')

  > colnames(x) <- c('c1','c2','c3')

  > x

      c1 c2 c3

   r1  1  4  7

   r2  2  5  8

   r3  3  6  9


  > x<-matrix(c(2:10), nrow=3, byrow = TRUE, dimnames = list(c("r1","r2","r3"), c("c1","c2","c3")))

  > x

      c1 c2 c3

   r1  2  3  4

   r2  5  6  7

   r3  8  9 10



  ###행렬 데이터 접근

  # 행과 열 번호로 접근 : 1부터 시작한다.

  > x[1,1]

   [1] 2

  > x[1,2]

   [1] 3

  #원소하나하나씩 말고 행별로 열별로 가져올 수 있다.

  > x[-3,]

      c1 c2 c3

   r1  2  3  4

   r2  5  6  7

  > x[1:2,]

      c1 c2 c3

   r1  2  3  4

   r2  5  6  7

  > x[,2:3 ]

      c2 c3

   r1  3  4

   r2  6  7

   r3  9 10

  > x[c(2:3), c(1:2)]

      c1 c2

   r2  5  6

   r3  8  9

  

 # 행과 열 이름으로 접근

 # 행이 item1인 열값 출력

  > x["item1",]

   fe1 fe2 fe3 

     1   4   7 

  

  > x

         fe1 fe2 fe3

   item1   1   4   7

   item2   2   5   8

   item3   3   6   9


  # 2번째 컬럼의 값이 5보다 큰 값 출력

  > x[x[,2] >= 5,]

         fe1 fe2 fe3

   item2   2   5   8

   item3   3   6   9


  # 행렬의 연산

  > x <- matrix(c(1:9), nrow = 3)

  > x

        [,1] [,2] [,3]

   [1,]    1    4    7

   [2,]    2    5    8

   [3,]    3    6    9

  > x*2    #각 원소값들을 2씩 곱한것

        [,1] [,2] [,3]

   [1,]    2    8   14

   [2,]    4   10   16

   [3,]    6   12   18

  > x       #다시 원래 원소값으로 돌아오고

        [,1] [,2] [,3]

   [1,]    1    4    7

   [2,]    2    5    8

   [3,]    3    6    9

  > x/2    #원래 원소값에서 2나눈 

        [,1] [,2] [,3]

   [1,]  0.5  2.0  3.5

   [2,]  1.0  2.5  4.0

   [3,]  1.5  3.0  4.5

  

  #행렬의 연산

  > x<-matrix(c(1:9), nrow = 3)

  > x+x

        [,1] [,2] [,3]

   [1,]    2    8   14

   [2,]    4   10   16

   [3,]    6   12   18

  > x

        [,1] [,2] [,3]

   [1,]    1    4    7

   [2,]    2    5    8

   [3,]    3    6    9

  > x-x

        [,1] [,2] [,3]

   [1,]    0    0    0

   [2,]    0    0    0

   [3,]    0    0    0

  > x

        [,1] [,2] [,3]

   [1,]    1    4    7

   [2,]    2    5    8

   [3,]    3    6    9

  > t(x) #전치 행렬(행과 열을 바꾸는 것)

        [,1] [,2] [,3]

   [1,]    1    2    3

   [2,]    4    5    6

   [3,]    7    8    9


  #행과 열의 개수 구하기

  > x<-matrix(c(1:6), ncol=3)

  > x

        [,1] [,2] [,3]

   [1,]    1    3    5

   [2,]    2    4    6

  > ncol(x)    #열의 갯수

   [1] 3

  > nrow(x)    #행의 갯수

   [1] 2 


 6. 배열 : 2차원 이상의 행렬 교재p.53~~


7. Data Frame : R에서 가장 중요한 자료형, DB의 테이블과 같은 형태를 가진다.

  #한번에 데이터 프레임에 넣는 방법

  > d<- data.frame(x=c(1,2,3,4,5), y=c(2,4,6,8,10))

  > d

     x  y

   1 1  2

   2 2  4

   3 3  6

   4 4  8

   5 5 10

  #위와 같은 결과값이 나온다. 따로따로 넣는 방법

  > x <- c(1:5)

  > y <- seq(2,10,2)

  > k <- data.frame(x,y)

  > k

     x  y

   1 1  2

   2 2  4

   3 3  6

   4 4  8

   5 5 10

  #data frame은 데이터 타입이 달라도 된다.

  > d<-data.frame(x=c(1:5), y=seq(2,10,2), z=c('M','F','M','F','M'))

  > d

     x  y z

   1 1  2 M

   2 2  4 F

   3 3  6 M

   4 4  8 F

   5 5 10 M

  #data frame의 구조

  > str(d)

   'data.frame': 5 obs. of  3 variables:

    $ x: int  1 2 3 4 5

    $ y: num  2 4 6 8 10

    $ z: Factor w/ 2 levels "F","M": 2 1 2 1 2

  #만들어진 데이터 프레임에 새 열을 추가할 때 '$열이름 <- ' 을 이용한다.

  > d

     x  y z

   1 1  2 M

   2 2  4 F

   3 3  6 M

   4 4  8 F

   5 5 10 M

  > d$v <- seq(3,15,3)

  > d

     x  y z  v

   1 1  2 M  3

   2 2  4 F  6

   3 3  6 M  9

   4 4  8 F 12

   5 5 10 M 15

  

  #컬럼의 이름으로 접근할 수 있다.

  > d$x

   [1] 1 2 3 4 5

  > d$z

   [1] M F M F M

   Levels: F M

  #위치를 지정하여 접근 할 수 있다.

  > d[1,2]

   [1] 2

  #x 컬럼이 3보다 큰 행을 출력

  > d[d$x>3,]

     x  y z  v

   4 4  8 F 12

   5 5 10 M 15

  #컬럼명을 지정하여 접근할 수 있다.

  > d[,c("x")]

   [1] 1 2 3 4 5


  #한 컬럼만 선택시 벡터처럼 출력되는데 이것을 방지 하기 위함

  > d[,c("x")]

   [1] 1 2 3 4 5

  > d[,c("x"), drop=FALSE]

     x

   1 1

   2 2

   3 3

   4 4

   5 5


  #rownames(), colnames()를 통해 행과 열에 이름을 부여

  > x<-data.frame(1:3)

  > x

     X1.3

   1    1

   2    2

   3    3

  > colnames(x) <- c('val')

  > x

     val

   1   1

   2   2

   3   3

  > rownames(x) <- c('a','b','c')

  > x

     val

   a   1

   b   2

   c   3


 타입판별, 변환

  # 타입 판별

  > class(c(1,2))

   [1] "numeric"

  > class(list(1,2))

   [1] "list"

  > class(data.frame(x=c(1,2)))

   [1] "data.frame"

  > is.numeric(c(1,2,3))

   [1] TRUE

  > is.matrix(matrix(c(1,2)))

   [1] TRUE


  #행렬이나 리스트를 데이터 프레임으로 변환 

  > x<-data.frame(matrix(c(1:4), ncol=2))

  > x

     X1 X2

   1  1  3

   2  2  4

  > colnames(x) <- c("X","Y")

  > x

     X Y

   1 1 3

   2 2 4


  ##as.numeric, as.factor등의 함수를 사용한 형 변환이 가능하다.

  > x<-c("m","f")

  > as.factor(x)    #벡터를 factor로 변환

   [1] m f

  Levels: f m

   > as.numeric(as.factor(x))     #factor를 숫자형벡터로 변환

   [1] 2 1

  > factor(c("m","f"), levels=c("m","f"))     #levels의 순서를 "m,f"로 하고 싶다면 강제로 지정

   [1] m f

   Levels: m f


 **factor는 그냥 넣거나 ordered사용하거나 강제 지정하면 순서대로 나오고, 값이 이미 있거나 하면 그대로 출력된다.