[데이터타입]
#행렬(matrix)
: 행과 열의 구조로 한가지 유형의 스칼라 데이터를 저장하는 데이터 구조
#matrix
> matrix(c(1,2,3,4,5,6,7,8,9,10), nrow=2) #nrow : 열부터 채운다(로우를 2개만듦)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> matrix(c(1,2,3,4,5,6,7,8,9,10), nrow=5)
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
> m <- matrix(1:9, nrow=3, dimnames=list(c("a","b","c"), c("A", "B", "C")))
> m
A B C
a 1 4 7
b 2 5 8
c 3 6 9
> rownames(m) #로우이름
[1] "a" "b" "c"
> colnames(m) #컬럼이름
[1] "A" "B" "C"
> m[1:2,] #1행에서 2행까지
A B C
a 1 4 7
b 2 5 8
> m[,1:2] #1열과 2열의 데이터
A B
a 1 4
b 2 5
c 3 6
> m[1,1] #1행 1열
[1] 1
> m[3,3] #3행 3열
[1] 9
> m[-1,] #1행을 뺀 데이터
A B C
b 2 5 8
c 3 6 9
> m[,-2] #2열을 뺀 데이터
A C
a 1 7
b 2 8
c 3 9
> m[m[,3]>8,] #m이라는 매트릭스의 3열의 데이터 중 8보다 큰 행의 데이터
A B C
3 6 9
#trnaspose : 행과 열을 피벗
> m
A B C
a 1 4 7
b 2 5 8
c 3 6 9
> t(m)
a b c
A 1 2 3
B 4 5 6
C 7 8 9
> nrow(m)
[1] 3
> NROW(m)
[1] 3
> ncol(m)
[1] 3
> NCOL(m)
[1] 3
> dim(m)
[1] 3 3
#행렬 연산
- 기본 사칙연산 : 같은 위치의 값을 연산한다.
- %*% : 행렬을 서로 곱한다. (같은 위치의 값 X, 진짜 행렬 곱하기ㅋㅋ)
#행렬연산
> 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
> x + x
[,1] [,2] [,3]
[1,] 2 8 14
[2,] 4 10 16
[3,] 6 12 18
> x - x
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0
[3,] 0 0 0
> x %*% x
[,1] [,2] [,3]
[1,] 30 66 102
[2,] 36 81 126
[3,] 42 96 150
#matrix.solve(a,b)
: a%*%x=b에서 x를 구한다. b를 정하지 않으면 a의 역행렬을 구한다.
#solve : 매트릭스를 만족하는 조건값을 구할때
> x <- matrix(c(1,2,3,4), nrow=2)
> solve(x)
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
> x %*% solve(x)
[,1] [,2]
[1,] 1 0
[2,] 0 1
#배열(array)
: 행렬이 2차원의 데이터 타입이라면 배열은 다차원 데이터를 저장하는 데이터 타입
#array
> array(1:12, dim = c(3,4))
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> x <- array(1:12, dim = c(2,2,3))
> x
, , 1 #첫번째 판
[,1] [,2]
[1,] 1 3
[2,] 2 4
, , 2 #두번째 판
[,1] [,2]
[1,] 5 7
[2,] 6 8
, , 3 #세번째 판
[,1] [,2]
[1,] 9 11
[2,] 10 12
> x[,,2]
[,1] [,2]
[1,] 5 7
[2,] 6 8
#데이터프레임(dataframe)
: 엑셀 스프레드시트와 같은 표형태의 데이터 타입
#data.frame
> df <- data.frame(x = c(1,2,3,4), y = c("a","b","c","d"), z = c("A","B","C","D"))
> df
x y z
1 1 a A
2 2 b B
3 3 c C
4 4 d D
> str(df)
'data.frame': 4 obs. of 3 variables:
$ x: num 1 2 3 4
$ y: Factor w/ 4 levels "a","b","c","d": 1 2 3 4
$ z: Factor w/ 4 levels "A","B","C","D": 1 2 3 4
> x <- df[1:2]
> x
x y
1 1 a
2 2 b
3 3 c
4 4 d
> colnames(x)
[1] "x" "y"
> rownames(x)
[1] "1" "2" "3" "4"
> df[-1,] #1행을 뺀 나머지 데이터
x y z
2 2 b B
3 3 c C
4 4 d D
> df[,-2] #2열을 뺀 나머지 데이터
x z
1 1 A
2 2 B
3 3 C
4 4 D
> df[-1,-1] #1행과 1열을 뺀 나머지 데이터
y z
2 b B
3 c C
4 d D
> df[, names(df) %in% c("x", "y")]
x y
1 1 a
2 2 b
3 3 c
4 4 d
#NA를 처리하는 방법들
:조건을 만족하는 특정원소 선택
> ex <- c(1,3,7,NA,12)
> ex[ex < 10]
[1] 1 3 7 NA
> ex[ex%%2 ==0]
[1] NA 12
> ex[is.na(ex)]
[1] NA
> ex[!is.na(ex)]
[1] 1 3 7 12
> ex[ex%%2 ==0 & !is.na(ex)]
[1] 12
> name <- c("kim", "lee", "park")
> age <- c(10,20,30)
> gender <- factor(c("M","F","M"))
> df <- data.frame(name,age,gender)
> df[df$gender == "M",]
name age gender
1 kim 10 M
3 park 30 M
> df[df$age < 25 & df$gender == "M",] #행에 대한 각각의 조건
name age gender
1 kim 10 M
#데이터 타입 판별하기
함수 | 의미 |
class(x) | 객체 x의 클래스 |
str(x) | 객체 x의 내부 구조 |
is.factor(x) | 팩터인가? |
is.numeric(x) | 숫자를 저장한 벡터인가? |
is.character(x) | 문자열을 저장한 벡터인가? |
is.matrix(x) | 행렬인가? |
is.array(x) | 배열인가? |
is.data.frame() | 데이터프레임인가? |
#수치연산
- n %% m : 나머지 연산
- n %/% m : 몫 연산
- n^m : n의 m승
- exp(n) : e의 n승
[프로그래밍]
#함수
#function1
> f <- function(df2) {
+ df2$a <- c(1,2,3,4)
+ return(df2)
+ }
> df <- data.frame(a=c(4,5,6,7))
> df
a
1 4
2 5
3 6
4 7
> df <- f(df)
> df
a
1 1
2 2
3 3
4 4
#function2
> f <- function(df2) {
+ df2$a <- c(1,2,3,4)
+ return(df2)
+ }
> df <- data.frame(a=c(4,5,6,7))
> df <- f(df)
> df
a
1 1
2 2
3 3
4 4
#조건문 if else, ifelse
#조건문
> a <- 7
> if (a > 8) {
+ print("a는 8보다 크다")
+ } else if (a>5 & a<=8) {
+ print("a는 5보다 크고 8보다 작다")
+ } else {
+ print("a는 5보다 작다")
+ }
[1] "a는 5보다 크고 8보다 작다"
> x <- c(1,2,3,4,5)
> ifelse(x%%2 ==0, TRUE, FALSE)
[1] FALSE TRUE FALSE TRUE FALSE
#반복문 : for, while, repeat
#반복문:for
> for(i in (1:10)) {
+ print(i)
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
#반복문:while
> i <- 1
> while(i <10){
+ print(i)
+ i <- i + 1
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
#반복문:repeat
> i <- 1
> repeat{
+ print(i)
+ if(i>=10){
+ break #repeat은 무조건 반복이므로, break필요
+ }
i <- i + 1
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[데이터처리]
#데이터읽기
: 파일로부터 데이터를 읽어와 R의 메모리 공간에 적절한 데이터 타입으로 로드함
- csv파일 로드
#file read
> path <- "C:\\Users\\user\\Desktop\\data\\usedcars.csv"
> f <- read.csv(path, stringsAsFactors=, encoding="UTF-8", header=T)
> f
year model price mileage color transmission
1 2011 SEL 21992 7413 Yellow AUTO
2 2011 SEL 20995 10926 Gray AUTO
3 2011 SEL 19995 7351 Silver AUTO
4 2011 SEL 17809 11613 Gray AUTO
5 2012 SE 17500 8367 White AUTO
6 2010 SEL 17495 25125 Silver AUTO
....
- table형태의 데이터 로드
> path <- "C:\\Users\\user\\Desktop\\data\\test.txt"
> f <- read.table(path) #있는그대로 읽어와 컬럼의 데이타도 요소화해버림
> f
V1 V2 V3 V4
1 no name age sex
2 1 Lee 55 M
3 2 Park 47 F
4 3 So 35 M
5 4 Kim 26 F
6 5 Yoon 29 M
> str(f)
'data.frame': 6 obs. of 4 variables:
$ V1: Factor w/ 6 levels "1","2","3","4",..: 6 1 2 3 4 5
$ V2: Factor w/ 6 levels "Kim","Lee","name",..: 3 2 4 5 1 6
$ V3: Factor w/ 6 levels "26","29","35",..: 6 5 4 3 1 2
$ V4: Factor w/ 3 levels "F","M","sex": 3 2 1 2 1 2
> path <- "C:\\Users\\user\\Desktop\\data\\workshop2.txt"
> f <- read.table(path, header=T, stringsAsFactor=F) #name은 factor가 아니므로!
> f
name weight height
1 Lee 93 1.72
2 Kim 82 1.81
3 Kueon 80 1.70
4 Kang 67 1.69
5 Choi 72 1.83
6 Keo 69 1.76
> str(f)
'data.frame': 6 obs. of 3 variables:
$ name : chr "Lee" "Kim" "Kueon" "Kang" ...
$ weight: int 93 82 80 67 72 69
$ height: num 1.72 1.81 1.7 1.69 1.83 1.76
#데이터확인
: R에 내장되어있는 데이터셋을 활용한 데이터 확인
#data processing
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
> str(iris)
'data.frame': 150 obs. of 5 variables: #150개 행, 5개 속성값
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
#데이터병합
rbind : 지정한 데이터를 행(row)단위로 병합
cbind : 지정한 데이터를 열(column)단위로 병합
#rbing/cbind
> rbind(c(1,2,3),c(4,5,6))
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
> cbind(c(1,2,3),c(4,5,6))
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> x <- data.frame(id=c(1,2), names=c("a","b"), stringsAsFactors = F)
> x
id names
1 1 a
2 2 b
> str(x)
'data.frame': 2 obs. of 2 variables:
$ id : num 1 2
$ names: chr "a" "b"
> y <- rbind(x,c(3,"c"))
> y
id names
1 1 a
2 2 b
3 3 c
#merge
: 두 데이터 프레임을 공통된 값 기준으로 묶는 함수 (서로 다른 table)
#merge
> x <- data.frame(name=c("a","b","c"), math=c(1,2,3))
> y <- data.frame(name=c("c","b","a"), eng=c(4,5,6))
> merge(x,y)
name math eng
1 a 1 6
2 b 2 5
3 c 3 4
> cbind(x,y)
name math name eng
1 a 1 c 4
2 b 2 b 5
3 c 3 a 6
> x <- data.frame(name=c("a","b","c"), math=c(1,2,3))
> y <- data.frame(name=c("c","b","a"), eng=c(4,5,6))
> merge(x,y,all=TRUE)
name math eng
1 a 1 6
2 b 2 5
3 c 3 4
#split
: 조건에 따라 데이터를 분리하여 리스트로 반환하는 함수
#split
> split(iris, iris$Species)
$setosa
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
....
$versicolor
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
51 7.0 3.2 4.7 1.4 versicolor
52 6.4 3.2 4.5 1.5 versicolor
53 6.9 3.1 4.9 1.5 versicolor
54 5.5 2.3 4.0 1.3 versicolor
55 6.5 2.8 4.6 1.5 versicolor
....
$virginica
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
101 6.3 3.3 6.0 2.5 virginica
102 5.8 2.7 5.1 1.9 virginica
103 7.1 3.0 5.9 2.1 virginica
104 6.3 2.9 5.6 1.8 virginica
105 6.5 3.0 5.8 2.2 virginica
....
'🤖 Education > 2019AI개발자양성과정(과기부)' 카테고리의 다른 글
[LAMP] (0) | 2023.01.30 |
---|---|
[AWS] 서버열기 (0) | 2023.01.30 |
[R_STUDY] 04. Workshop (0) | 2023.01.30 |
[R_STUDY] 03. 데이터프로그래밍 ~ 함수적용 (0) | 2023.01.30 |
[R_STUDY] 01. 기본 ~ 데이터타입 (0) | 2023.01.30 |