데이터 R지?

Ch9_데이터 구조 - 1. 데이터 구조와 연산

jsBae 2022. 4. 29. 17:05
1. 변수
2. 벡터
3. 팩터
4. 행렬
5. 리스트
6. 데이터 프레임

1. 데이터  구조와 연산

변수 (Variable) :  수시로 변하는 정보를 담는 저장 공간의 이름,

  • 변수는 메모리 공간에 붙이는 레이블
  • 변수는 데이터 값을 저장하기 위한 컨테이너!

#변수에 값 할당하기 

할당(assignments)이란 어떤 변수에 데이터를 저장하는 것을 말한다.
 ‘<-’ 또는 ‘=’ 연산자를 이용하여 이루어진다.  

R에서 변수 할당 alt + - 

예를 들어 x에 1라는 숫자 데이터를 할당하였다면

x <- 1 # ctrl + enter
x

R의 기본적인 데이터 유형

  • 수치형 (Numeric) : 숫자, 정수형과 실수형
  • 문자형 (Character) : 글자, "", ''로 묶임 
  • 논리형 (Logical) : True or False (T, F 대문자임, T, F로 사용 할 수 있음)
  • 복소수형 (Complex) : 실수와 허수형으로 이루어진 복소수
데이터 구조 설명 예시
Scala 구성인자가 하나인 벡터 [1] 1
Vector 동일한 유형의 데이터가 1차원으로 구성 [1] 1 2 3 4 5
Factor 범주형 데이터 구조 [1] 1 2 3
Levels: 1 2 3
Matrix 동일한 유형의 데이터가 2차원으로 구조 (행, 열)      [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
Array 동일한 유형의 다차원 데이터 구조 (행렬의 여러 겹으로 표현)  
List 서로 다른 데이터 구조의 묶음  
Data Frame 데이터 유형과 상관없이 2차원 형태의 데이터 구조  

 

1. 변수명 조건

  • 변수명은 영문, 숫자, 마침표, 밑줄 사용이 가능
  • 단, 첫글자는 숫자는 불가능.
  • 변수명 중간에 공백을 만들 수 없음
  • 영문 사용 권장

2. 변수 만들기와 데이터 타입 확인

# 변수의 데이터타입을 확인하기 위해 class(), str() 함수 사용할 수 있음

a <- 2
b <- 3

a+b
[1] 5

str(a)
num 2

class(a)
"numeric"

#문자형 변수 (문자는 큰따옴표(“) 또는 작은따옴표(‘)를 붙여서 할당함)

str <- "a"
str2 <- "b"
Myname <- "홍길동"
str3 <- "hello world" #변수에 여러 개의 문자, 문장도 담을 수 있음.
> c <- FALSE
> c
[1] FALSE
> class(c)
[1] "logical"

변수형 변경 

  • as.numeric()
  • as.logical()
  • as.factor()
  • as.character()
  • as.data.frame()

#숫자형 변수로 변경할 때는 as.numeric() 함수 사용함.

a <- as.numeric(a) # 숫자형으로 변경

#문자형 변수로 변경할 때는 as.character() 함수 사용함.

b <- as.character(b)

예제

> a <- "1"
> class(a)
[1] "character"
> a <- as.numeric(a)
> class(a)
[1] "numeric"

##1.2 벡터

  • c() 함수사용
  • 수치형의 데이터 뿐만 아니라 문자형, 논리형의 값들도 벡터로 만들 수 있다
> a <- c(3,2,5,8,1)
> y <- c("a","b","c") #문자형
> z <- c(TRUE, FALSE, TRUE) #논리형
> a
[1] 3 2 5 8 1
> y
[1] "a" "b" "c"
> z
[1]  TRUE FALSE  TRUE

#숫자와 문자가 같이 있는 벡터는 문자형으로 인식

> var <- c(1,2,3,"a","b","c")
> var
[1] "1" "2" "3" "a" "b" "c"
> class(var)
[1] "character"

#콜론(:) 연산자를 사용하여 연속되는 값들 생성 가능

> a <- c(1:10)
> a
 [1]  1  2  3  4  5  6  7  8  9 10

#seq(a,b) a에서 b까지 생성

> a <- seq(1,5) #seq(a,b) a에서 b까지 생성
> a
[1] 1 2 3 4 5
> b <- seq(1, 13, by=2)#seq(a,b, by=c) a에서 b까지 c만큼씩씩생성
> b
[1]  1  3  5  7  9 11 13
> c <- seq(1, 13, by=3)
> c
[1]  1  4  7 10 13
> d <- seq(2,20,5 )
> d
[1]  2  7 12 17
> e <- seq(1, 10, length.out=3) #seq(a,b,length.out=c) a에서 b까지 3개수 등분할
> e
[1]  1.0  5.5 10.0

# rep()  반복 함수 사용

> a <- rep(1, times=3) #1을 3번 반복
> a
[1] 1 1 1
> a <- rep(1, times=3) #1을 3번 반복
> a
[1] 1 1 1
> b <- rep(1:3, times=5) #1에서3까지 5반복
> b
 [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
> c <- rep(c(3,6,4), times=4) #3,6,4를 4반복
> c
 [1] 3 6 4 3 6 4 3 6 4 3 6 4
> d <- rep(c("haah", "kkk"), times=3) #haha, kkk를 3번 반복 d
> d
[1] "haah" "kkk"  "haah" "kkk"  "haah" "kkk"

 

#2.벡터의 연산

> a <- c(1:5)
> a
[1] 1 2 3 4 5
> b <- seq(2,10,2)
> b
[1]  2  4  6  8 10
> a+2
[1] 3 4 5 6 7
> a*10
[1] 10 20 30 40 50
> a+b
[1]  3  6  9 12 15
> b-3
[1] -1  1  3  5  7
> (a+b)*2
[1]  6 12 18 24 30

#비교연산과 논린연산의 수행

> 2>5    #크다
[1] FALSE
> 4<=10  #이하   
[1] TRUE
> 7!=7   #같지 않다
[1] FALSE
> 4==7   #같다
[1] FALSE

###OR 연산

> #OR 연산
> TRUE | TRUE
[1] TRUE
> TRUE | FALSE
[1] TRUE
> FALSE| TRUE
[1] TRUE
> FALSE | FALSE
[1] FALSE

> c(TRUE, TRUE, FALSE) | c(FALSE, TRUE, FALSE)
[1]  TRUE  TRUE FALSE

###and 연산

> TRUE & TRUE
[1] TRUE
> TRUE & FALSE
[1] FALSE
> FALSE & TRUE
[1] FALSE
> FALSE & FALSE
[1] FALSE

> c(TRUE, TRUE, FALSE) & c(FALSE, TRUE, FALSE)
[1] FALSE  TRUE FALSE

논리연산에서 숫자의 경우, 0은 FALSE , 0이외는 TRUE

> 1&2
[1] TRUE
> 1&0
[1] FALSE
> !0
[1] TRUE
> !1
[1] FALSE

#연습

> score <- 65
> (score>=50) & (score<60)
[1] FALSE
> (score>=60) & (score<70)
[1] TRUE

 

#3.벡터인덱싱

인덱싱 : 변수에 어떻게 접근 할 수 있을까?

  • 변수 내의 번호(순서)를 호출
  • 인덱스는 1부터 시작 (0부터 아님)
  • [인덱스]
  • [-인덱스] : 인덱스 앞에 -를 붙이면 제외한 나머지 값을 출력
> a <- c(2,7,4,6,1)
> a[1]             #첫번째 원소
[1] 2
> a[2]             #두번째 원소
[1] 7
> a[3]             #세번째 원소
[1] 4
> a[7]
[1] NA

#여러개의 원소를 한번에 접근
> a <- c(2,7,4,6,1)
> 
> a[-3]            #세번째 원소를 제외한 나머지 출력
[1] 2 7 6 1
> a[c(-3,-5)]      #세번째와 다섯번째 원소를 제외한 나머지 출력
[1] 2 7 6
> a[-c(3,5)]       #세번째와 다섯번째 원소를 제외한 나머지 출력
[1] 2 7 6
> a[c(-3:-5)]      #세번째부터 다섯번째 원소까지를 제외한 나머지 출력
[1] 2 7
> a[-c(3:5)]       #세번째부터 다섯번째 원소까지를 제외한 나머지 출력
[1] 2 7

#인데스 이름 지정

> score <- c(95, 80, 85)
> names(score) <- c("Math","English","Korean")
> score
   Math English  Korean 
     95      80      85
     
> score["Math"]
Math 
  95 
> score["English"]
English 
     80 
> score["Korean"]
Korean 
    85

#원소 값 변경

> a <- c(5, 8, 9, 6, 3, 7)
> a[3] <- 1
> a
[1] 5 8 1 6 3 7
> a[c(1, 6)] <- c(4, 2)  #1, 6번째 원소를 4와 2로 변경
> a
[1] 4 8 1 6 3 2

#비교연산에 의한 인덱싱

> x <- c(1, 2, 3, 4, 5)
> x>3
[1] FALSE FALSE FALSE  TRUE  TRUE
> x[x>3]
[1] 4 5
> x[-(x>3)]
[1] 2 3 4 5
> x <- c(1, 2, 3, 4, 5)
> x >3               #3보다 크면 TRUE, 작으면 FALSE 출력
[1] FALSE FALSE FALSE  TRUE  TRUE
> x[(x>3)]           #3보다 큰 원소만 출력
[1] 4 5
> x[-(x>3)] 
[1] 2 3 4 5
> x <=3              #3보다 작거나 같으면 TRUE, 아니면 FALSE 출력
[1]  TRUE  TRUE  TRUE FALSE FALSE
> x[(x<=3)]          #3보다 작은 원소만 출력
[1] 1 2 3
> x[-(x<=3)]         #3보다 큰 원소 출력
[1] 2 3 4 5
> x <- c(1, 2, 3, 4, 5)
> x%%2==1
[1]  TRUE FALSE  TRUE FALSE  TRUE
> x[x%%2==1]
[1] 1 3 5
> x[!(x%%2==1)]
[1] 2 4

4.벡터 함수

함수명 설명
sum() 원소들의 합
mean() 원소들의 평균
median() 원소들의 중간값
var() 원소들의 분산
sd() 원소들의 표준편차
max() 최대값
min() 최소값
sort() 정렬(기본 오른차순), descreasing
range() 원소들의 범위
legth() 원소들의 개수
table() 원소들의 빈도수
함수명 의미 사용예 결과
sqrt() 제곱근 sqrt(4) 2
abs() 절대값 abs(-4) 4
log() 로그값 log(1) 0
exp() 지수값 exp(1:5) 2.718282
round() 반올림 round(103.456, digit=2)
round(103.456, digit=-2)
103.46
100
> x <- c(2, 4, 10, 7, 9, 3, 1, 6, 8, 5)
> sum(x)                          # x의 모든 원소의 합
[1] 55
> sum(x + 3)                      # x의 원소에 3을 더한 뒤 합 계산
[1] 85
> mean(x)                         # x의 평균
[1] 5.5
> mean(x[1:5])                    # x의 원소중 1~5번째 원소들의 평균
[1] 6.4
> sd(x)                           # x에 포함된 원소의 표준편차 
[1] 3.02765
> max(x)                         # x의 최대값 
[1] 10
> min(x)                         # x의 최소값
[1] 1
> sort(x, decreasing = FALSE)      # 정렬의 기본은 오름차순(sort(x)도 같은 출력값을 보임)
 [1]  1  2  3  4  5  6  7  8  9 10
> sort(x, decreasing = TRUE)       # 내림차순 정렬
 [1] 10  9  8  7  6  5  4  3  2  1

#수학 함수

> sqrt(14) #제곱근
[1] 3.741657
> abs(-7)  #절대값
[1] 7
> log(1)   #로그값
[1] 0
> exp(1:5) #지수값
[1]   2.718282   7.389056  20.085537  54.598150 148.413159
> round(103.456) #반올림
[1] 103
> round(103.456, digits=2)
[1] 103.46
> round(103.456, digits=-2)
[1] 100
> round(exp(1:5),digits=1)
[1]   2.7   7.4  20.1  54.6 148.4

1.3 Factor

> size <-c("big","small","middle","small","big","big")
> size
[1] "big"    "small"  "middle" "small"  "big"    "big"   
> str(size)
 chr [1:6] "big" "small" "middle" "small" "big" "big"
> size <- factor(size)
> size
[1] big    small  middle small  big    big   
Levels: big middle small
> str(size)
 Factor w/ 3 levels "big","middle",..: 1 3 2 3 1 1
> as.numeric(size)
[1] 1 3 2 3 1 1
> 
> levels(size)  #레벨 확인
[1] "big"    "middle" "small"

# 예제 : 성적

> grade <- c("A","C","B","D","A","A","B","B","D")
> grade
[1] "A" "C" "B" "D" "A" "A" "B" "B" "D"
> str(grade)
 chr [1:9] "A" "C" "B" "D" "A" "A" "B" "B" "D"
> grade <- factor(grade, levels=c("A","B","C","D","F"), ordered = TRUE)
> str(grade)
 Ord.factor w/ 5 levels "A"<"B"<"C"<"D"<..: 1 3 2 4 1 1 2 2 4
> table(grade)
grade
A B C D F 
3 3 1 2 0 
> grade
[1] A C B D A A B B D
Levels: A < B < C < D < F

 

728x90
반응형
댓글수0