7 분 소요

R의 변수 및 데이터구조

변수타입 , 데이터구조

일반적으로 R에서 다루는 모든것이 자료형과 자료구조이다. 이중에서 R에서 더이상 쪼갤 수 없는 원자수준의 개념이 변수타입으로 보고, 이 들을 묶어놓은 객체를 데이터 구조로 이해하면 좋을것 같다
원자 자료형이라는 것은 벡터가 한가지 자료형 데이터만 담는다는 의미이다.

변수타입의미비고판별
Numeric실수연산가능 ,as.factor(), 2/1.5is.numeric(x)
Integer정수연산가능, as.integer(), 2L/3Lis.integer(x)
Complex복소수연산가능, as.complex(), 1+5iis.complex(x)
Character문자연산불능, as.characteris.character(x)
Logical논리연산불능, as.logical, TRUE/FALSEis.logical(x)
Factor범주연산불능 ,as.factor()is.factor(x)
Date날짜연산불능, as.Dateis.date(x)
데이터구조차원비고판별
Vector1한가지변수타입is.vector(x)
Dataframe2다양한변수타입 -> 대부분 데이터 분석에 사용is.data.frame(x)
Matirx2한가지변수타입is.matrix(x)
Array다차원동일한구조, 2차원이상Matrixis.array(x)
List다차원서로다른구조, 2차원이상의Dataframe -> Web Data 사용is.list(x)

조사함수 종류

구분내용예시
class()객체유형
        > df = data.frame(x=c(1,2,3), y=c("A","B","C"))
        > typeof(df$x);mode(df$x);class(df$x);length(df$x);attributes(df$x)
            [1] "double"
            [1] "numeric"
            [1] "numeric"
            [1] 3
            NULL
        > typeof(df);mode(df);class(df);length(df);attributes(df)
            [1] "list"
            [1] "list"
            [1] "data.frame"
            [1] 2
            $names
            [1] "x" "y"

            $class
            [1] "data.frame"

            $row.names
            [1] 1 2 3
    
typeof()객체의자료형
mode()객체의자료형
length()길이
attributes()메타종류

R의 연산자

  • 연산자 정리
    구분내용표기
    변수값할당c(): concatenate 또는 combine 함수x<-1 , x = c(1,2,3,4,5)
    산술연산자+,-,*,^, %%(나머지), %/%(몫) , & numeric끼리만 연산, character연산시 오류
    벡터연산자x=y,x+y+1,x * y, log....
    • & :연산자 possible only for numeric, logical or complex types
    • &는 원소단위의 개별연산 결과를 출력. &&는 첫번째 원소간의 연산결과를 출력

R의 연산 및 자료형 샘플 코드

  • 생성 : c(데이터의 나열)
  • 벡터란 동일한 자료형의 데이터를 연속적으로 모아놓은 자료형 - 1차원
  • 데이터 사용
    • 벡터[인덱스] : 인덱스는 1부터 시작함, 음수를 사용하면 그 인덱스 제외 의미, : 을 이용해서 범위 선택 가능
  • 데이터 연산
    • 벡터끼리 해당 인덱스에 대한 연산이 가능

벡터연산

# 벡터연산

> x = c(1,2,c(3,4),5,6); x
## [1] 1 2 3 4 5 6
> seq(5) #증가함후
## [1] 1 2 3 4 5
> seq(-2,2,by=0.5)
## [1] -2.0 -1.5 -1.0 -0.5  0.0  0.5  1.0  1.5  2.0
> rep(1,5)
## [1] 1 1 1 1 1
> rep(seq(-2,2,by=0.5))
## [1] -2.0 -1.5 -1.0 -0.5  0.0  0.5  1.0  1.5  2.0
> c(1,2,3)+rep(3,3)
## [1] 4 5 6
> c(1,2,3)*3
## [1] 3 6 9
> 1:6 + 1:4 #recycle rule
## Warning in 1:6 + 1:4: 두 객체의 길이가 서로 배수관계에 있지 않습니다

## [1] 2 4 6 8 6 8

벡터함수

# 벡터함수

> x = c(1,3,6,5,2)
> y = c(2,7,3,1,0)

> sort(x)
## [1] 1 2 3 5 6
> rank(x)
## [1] 1 3 5 4 2
> order(x)
## [1] 1 5 2 4 3
> quantile(x)
##   0%  25%  50%  75% 100% 
##    1    2    3    5    6
> cumsum(x) #누적합계
## [1]  1  4 10 15 17
> cumprod(x) #누적곱
## [1]   1   3  18  90 180
> cummax(x)
## [1] 1 3 6 6 6
> cummin(x)
## [1] 1 1 1 1 1
> pmax(x,y,1:5) #parrellel
## [1] 2 7 6 5 5
> pmin(x,y,1:5)
## [1] 1 2 3 1 0
> xy = matrix(c(x,y),nrow = 2, byrow=T)
> xy
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    6    5    2
## [2,]    2    7    3    1    0
# column 기준 합산
> colMeans(xy)
## [1] 1.5 5.0 4.5 3.0 1.0
> colSums(xy)
## [1]  3 10  9  6  2
# row 기준 합산
> rowMeans(xy)
## [1] 3.4 2.6
> rowSums(xy)
## [1] 17 13

Factor형 변수

  • factor() 함수를 통해 범주형 변수를 선언 (예) 성별(남,여), 직업(공무원,회사원 ..), 산업분류 등 - 주로 빈도수기반 분석이 진행됨

  • 서열척도에 해당하는 순서가 있을 경우 ordered() 함수를 이용 (예) 학점(A,B,C, …), 신용등급(1등급,2등급,3등급..), 메달순위(금,은,동)

# Factor 형 변수
> x = c(4,5,5,6,6,6)
> factor(x); species = factor(x)
## [1] 4 5 5 6 6 6
## Levels: 4 5 6
> levels(species) =  c("A","B","C")
> table(species)
## species
## A B C 
## 1 2 3
# ordered 형 변수
> ordered(x)
## [1] 4 5 5 6 6 6
## Levels: 4 < 5 < 6
> y = ordered(x); class(y)  # factor에 order가 추가됨
## [1] "ordered" "factor"

행렬 처리 및 연산

# 행렬처리 및 연산
> x = 1:12
> matrix(x, ncol=3)
##      [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11
## [4,]    4    8   12
> y=matrix(x, nrow=3, byrow=T)
> y
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8
## [3,]    9   10   11   12
> rbind(y, 5:8)  #row 추가
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8
## [3,]    9   10   11   12
## [4,]    5    6    7    8
> cbind(7, 5:7)  #col 추가
##      [,1] [,2]
## [1,]    7    5
## [2,]    7    6
## [3,]    7    7
> y[1,3]
## [1] 3
> y[,2]  # 2번째 column 추출
## [1]  2  6 10
> y[3,]  # 3번째 row 추출
## [1]  9 10 11 12
> t(y)   #전치행렬
##      [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11
## [4,]    4    8   12

행렬과 리스트 클래스

  • matrix는 구성 요소의 데이터 타입이 동일하여야 한다.
    • 생성 : matrix(c(데이터나열) , nrow 또는 ncol , brow)
    • 접근방법 : 행렬[행번호,열번호] , 행/열 번호 대신 c를 사용하여 연속범위 도 지정 가능
    • 행렬 끼리 산술연산 가능하며 연산시 벡터수와 컬럼의 수는 같아야 함
  • 서로 다른 데이터 타입이나 길이를 가지는 경우 list 를 사용.
    • java의 Map 과 유사한 구조
    • 생성 : x = list( 키=1,키=c(1,2,3), … )
    • 키와 값을 쌍으로 저장하는 자료구조 list(키=값,키=값,…)
    • 접근방법 : list$키, 리스트[[인덱스]][인덱스] -> 키를 정의하 지 않은경우
    • 연산방법 : 리스트 끼리의 연산은 paste(x, y) 를 주로 사용
# matrix type
> x=c(2,3,4)
> a = c("low","high","high")
> y = c(1.2, 3.0, 4.8)
> matrix(c(x,y), ncol=2)
##      [,1] [,2]
## [1,]    2  1.2
## [2,]    3  3.0
## [3,]    4  4.8
> matrix(c(x,a), ncol=2) # default 세로 기준으로 먼저 채운다
##      [,1] [,2]  
## [1,] "2"  "low" 
## [2,] "3"  "high"
## [3,] "4"  "high"
> matrix(c(x,a), nrow = 2, byrow=T) # 가로 기준으로 채운는 옵션
##      [,1]  [,2]   [,3]  
## [1,] "2"   "3"    "4"   
## [2,] "low" "high" "high"
# list type
> z=c(TRUE,FALSE)
> L = list(grd=a, math=y, pass=z); L
## $grd
## [1] "low"  "high" "high"
## 
## $math
## [1] 1.2 3.0 4.8
## 
## $pass
## [1]  TRUE FALSE
> L$math   # L의 math 이름을 가진값
## [1] 1.2 3.0 4.8
> class(L[[2]]); L[[2]]  # 두번째 리스트
## [1] "numeric"

## [1] 1.2 3.0 4.8
> L[[2]][3] # 두번째 리스트의 3번째 값
## [1] 4.8
> x = list(1,2,3,4); y = list(1,2,3,4); # 리스트 선언 키없이
> z = list(x[[1]]+y[[1]], x[[2]]+y[[2]] , x[[3]]+y[[3]] , x[[4]]+y[[4]] ) # 리스트 더하기 연산
> z
## [[1]]
## [1] 2

## [[2]]
## [1] 4

## [[3]]
## [1] 6

## [[4]]
## [1] 8
> paste(x,y); # 문자열 형태로 합산 , 문자열 리스트에 주로 사용
## [1] "1 1" "2 2" "3 3" "4 4"

데이터프레임 클레스

  • matrix - 데이터타입 동일, list - 서로다른 길이 서로다른 데이타 타입
  • data frame - matrix와 list의 중간형태로 동일한 길이에 서로다른 타입은 허용 하지만 column내 에서는 동일한 데이터 타입
  • 데이터 분석을 위해 주로 사용
# 데이터 프레임 클래스
> students = c("송중기","이병혼","송혜규","채인표")
> test.results = c(76,82,84,67)
> test.grade = c("B","A","A","C")
> Mydf = data.frame(students, test.results, test.grade)
> class(Mydf)
## [1] "data.frame"
> ummary(Mydf)
##    students          test.results    test.grade       
##  Length:4           Min.   :67.00   Length:4          
##  Class :character   1st Qu.:73.75   Class :character  
##  Mode  :character   Median :79.00   Mode  :character  
##                     Mean   :77.25                     
##                     3rd Qu.:82.50                     
##                     Max.   :84.00
> Mydf = data.frame(students, test.results, test.grade, stringsAsFactors = TRUE)   #범주형 데이터로 인식
> summary(Mydf)
##    students  test.results   test.grade
##  송중기:1   Min.   :67.00   A:2       
##  송혜규:1   1st Qu.:73.75   B:1       
##  이병혼:1   Median :79.00   C:1       
##  채인표:1   Mean   :77.25             
##             3rd Qu.:82.50             
##             Max.   :84.00

자료 입력

# concatenate 또는 combine function : c()
> x = c(1,2,3,4,5)
> a = c("low","high","high")
> y = c(1.2, 3.0, 4.8)

# scan() function
> x = scan()

# read.table() function
> data1 = read.table( 'c:/R_Study/data.txt' , header = TRUE)
> data1
##   name age sex
## 1  Lee  55   M
## 2 Park  42   F
## 3  Kim  26   F
## 4 Yoon  29   M
#  Ctrl-c 키를 이용한 입력
> StatScore = read.table("clipboard", h=T)  # 맥 사용자 - read.table(pipe("pbpaste"), h=T)
> head(StatScore)
##   중간고사 퀴즈 기말고사 과제점수 출석점수
## A1       32   77       50      100      100
> data1 = read.table('clipboard', h=T)
> ata1
##    중간고사 퀴즈 기말고사 과제점수 출석점수
## A1        32   77       50      100      100
#  맥 사용자 - cilp = pipe("pbcopy","w"); wirte.table(data,file=clip); close(clip)
> write.table(data1, 'clipboard', row.names=FALSE, sep=",")  # 클립보드로 다시 복사

한글 깨지는 경우

# 한글에 대한 인코딩을 UTF-8로 변경
#Sys.setlocale('LC_ALL', 'ko_KR.UTF-8')

# 인코딩 확인하기
#sessioninfo()

# 윈도우 엑셀은 euc-kr로 저장되기 때문에 글자가 깨지는 경우
#read.csv('파일이름.csv', fileEncoding = 'euc-kr')

# 맥사용자 한글 깨지는 경우
# family="AppleGothic" 설정 또는 install.packages('extrafont') ; library(extrafont) ; font_import(); font();

댓글남기기