본문 바로가기

데이터/데이터마이닝

R 기초

 

 

    파이썬과는 다른 R에 대해서 좀 알아보겠습니다. 언어의 syntax는 언어들마다 다르기 때문에 좀 알아가는 시간이 필요합니다. 파이썬보다는 쉽지만 또한 그때문에 좀 까다로운 면이 있습니다.

 

 

R데이터형 확인

class(x)

 

mode(x)

 

is.numeric(x)

 

is.integer(x)

 

is.logical(x)

 

is.character(x)

 

 

R데이터형 변경

 

as.logical(x)

 

as.character(x)

 

 

R기타 데이터

NULL

비어있다는 의미(0조차도 아니다)

-반복적인 연산에서 배열이나 변수의 초기값(아무것도 들어있지 않음)으로 사용

-배열의 초기값이나 다른 변수의 속성을 제거하는데 사용

NA

결손값(not available)

NaN

비수치(not a number), 0/0인 경우

Inf

무한대, 1/0인 경우, -inf(음의 무한대)

factor(인자)

1:남성 2:여성 등 수준을 나타냄

 

R 벡터

정의 : 하나 이상의 수치, 논리 문자등으로 구성된 1차원 데이터 구조

요소의 기본형은 동일: 서로 다른형일 때는 강제 형 변환됨. 우선순위 문자열>복소수>숫자>논리식

속성: 벡터를 구성하는 기본형과 요소 개수의 길이

벡터를 만드는 방법

C 함수 이용: c는 connect의미

x <- c(1,2,3)

y <- c("a", "b", "c")

z <- c(TRUE, FALSE, TRUE)

Sequence 연산자 ":" 사용 ex) x <- 2:6 = > 2,3,4,5,6

seq 함수 이용: seq(시작, 종료, 간격)

y <- seq(1,3,0.5) => 1, 1.5, 2.0, 2.5, 3.0 (3 이하에서 0.5씩 증가)

z <- seq(0, 20, length=5) : 0~20 구간을 등간격으로 5개 숫자를 만듬

rep 함수 이용: repeat를 의미. 어떤 값을 반복해서 저장할 때 사용

rep(3:5, times=2) => 3,4,5,3,4,5

rep(3:5, each=2) => 3,3,4,4,5,5

x <- rep(c("a", "b"), each = 3) => "a", "a", "b", 'b"

vector() 이용 : 0 으로 초기화 된 10개 원소를 갖는 벡터

x <- vector("numeric", length=10) => 0,0,0,.....,0

벡터 요소에 이름 부여

x <- c(100, 40, 60)

names(x) <- c("Toatal", "A", "B")

벡터 요소의 접근: index이용 (index는 1부터 시작....정말 가지가지...)

x[n]: 벡터 x의 n번째 원소, n은 숫자 혹은 이름

x[-n]: n번째 요소를 제외한 나머지

x[idx_vector(벡터값)]: idx_vector(벡터값)에 지정된 요소

x[start:end] : x의 start에서 end까지 요소를 반환

v <- c(1, 3, 5, 7, 9)

v[1] v[-1] v[c(1,3,5)] v[seq(1,5,2)] v[1:3]

이름으로 값 추출하기

x <- c(100, 40, 60);

names(x) <- c("Total", "A", "B")

 

x["Total"]; x[c("A", "B")]

벡터의 연산

길이가 같은 2 벡터에서 같은 위치의 요소들끼리 연산

x+y, x-y, x*y, x/y, x^y(지수승)

length(x) : 벡터의 요소 개수, nchar(x) : 각 요소 문자열 길이

벡터에 대한 모든 원소에 대한 연산

x <- c(1,3,5)

y <- x+2

x => 3,5,7

 

z <- 2*y

z => 6,10,14

벡터의 연산 함수

identical(x,y)

2벡터가 동일한지 판단, 반환값 :TRUE/FALSE

union(x,y)

x와 y의 합집합을 반환

intersect(x,y)

x와 y의 교집합을 반환

setdiff(x,y)

x와 y의 차집합을 반환

setequal(x,y)

요소가 같은 집합인지 판단(개수 무시)

value %in% x

x에 value가 있는지 판단

x+c(1,2)

x의 길이가 2 이상이면 c(1,2)가 반복 사용됨

예시: x <- (1,2,3,4,5,6)

x+c(1,2)

=>2,4,4,,6,6,8

sum(x)

x의 요소의 합을 반환

벡터의 비교연산 논리연산

x <- c(1,2,3,4,5)

x>=3

=> FALSE FALSE TRUE TRUE TRUE

x[x>=3]

=> 3,4,5 TRUE 인것만 선택

sum(x>=3)

=>3, TRUE인 것의 개수

sum(x[x>=3])

=> 12, TRUE 인 것의 합

v <- x >=3 & x < 5

v

=> FALSE FALSE TRUE TRUE FALSE

w <- x < 3 | x > 4

w

=> TRUE TRUE FALSE FLASE TRUE

논리 부정 (!)

x <- TRUE

!x

=> FALSE

x <-3

!x

=> TRUE (R 에서는 숫자의 경우 0이면 FALSE, 그 외는 TRUE로 인식됨)

진위 여부

isTRUE(x) 를 사용합니다.

 

R배열

정의

같은 데이터형으로 행과 열로 구성된 2차원 배열

속성

length(요소개수)

요소개수

mode(요소자료형)

요소 자료형

nrow, ncol

행과 열의 개수

행렬을 만드는 방법

matrix()

요소의 자료형이 모두 동일

 

data.frame()

서로 다른 자료형

matrix() 이용

matrix(data, nrow, ncol, byrow=FALSE, [dimnames])

x <- matrix(1:6, nrow=2, byrow=FALSE)

1~6 정수를 행의 수가 2인 행렬

(byrow=FALSE : 원소값 할당 순서는 열 우선 입력됨)

y <- matrix(1:6, nrow, byrow=TRUE)

(byrow=TRUE : 원소값 할당 순서는 행 우선 입력됨

백터 결합

cvind() : column방향으로 벡터를 묶습니다.

v1 <- c(1,2,3)

v2 <- c(3,4,5)

v3 <- c(6,7)

w1 <- cbind(v1, v2)

w2 <- rbind(v1, v2)

 

기존의 matrix와 vector 결합하기

z1 <- rbind(x, v1)

z2 <- cbind(x,v3)

rvind(): row 방향으로 벡터를 묶습니다.

행렬 데이터 접근: x[r-idx, c-idx]

x[1,2]

1번째 행, 2번째 열에 있는 요소의 값

x[1:2, ]

index 가 생략되면 해당 index전체

x[ , 3]

3번째 열 전체 => 벡터를 반환

x[-3,]

3번째 행을 제외한 나머지

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

1행, 3행, 1열, 3열 값만 추출

x <- matrix(1:20, nrow=4, ncol=5)

?

행과 열에 이름 붙이기

rownames(x)

(row.names(x) 로 온점을 찍어도 상관없습니다. 값은 똑같이 나옵니다)

행의 이름

rownames(x) <- c("r1", "r2", "r3", "r4")

colnames(x)

열의 이름

colnames(x) <- c("c1", "c2", "c3", "c4", "c5")

행과 열 이름으로 배열 요소 접근 가능

x[ , "c2"], x["r3", ]

 

R데이터프레임(data.frame)

아래의 데이터프레임을 예제로 설명하겠습니다.

 

student

score

eval

1행

Han

95

A

2행

Kim

88

B

3행

Um

90

A

4행

Park

79

C

 

데이터 프레임이란?

행과 열로 구성되며 엑셀 스프레드시트와 유사함

각 행은 하나의 관측자료(record)

각 열(속성)은 길이는 동일한 벡터

각 열들 간의 데이터 유형은 서로 다를 수 있음

데이터 프레임 만들기

data.frame()을 이용하여 여러개의 벡터를 묶는다. (class는 data.frame)

student <- c("Han", "Kim", "Um", "Park")

score <- c(95, 88, 90, 79)

eval <- c("A", "B", "A", "C")

grade <- data.frame(student, score, eval)

R에서 제공하는 데이터

date()로 확인가능 : quakes 데이터 불러오기=> data(quakes)

 

iris data: 분꽃 3종류의 꽃받침, 꽃잎의 길이와 넓이, 품종

파일로 저장된 것을 읽기(excel, csv, text 파일)

data.frame에서 열 데이터 추출 방법 (위에있는grade 데이터 프레임에서가져와보겠습니다.)

is.data.frame(grade)

=> "data.frame" (TRUE인경우에만 class반환합니다)

grade[ , "student"]

=> student 열백터 반환(1차원벡터)

grade["student"]

=> student 열을 data.frame으로 반환

grade$student

=> student 열벡터 반환(1차원벡터)

data.frame에서 일부 데이터 추출 방법

grade[ , c(1:2)]

=>모든행, 1열 2열을 data.frame으로 반환

grade[ , c("student", "score")]

=>모든행, student열과 score열을 data.frame으로 반환

grade[1:3, ]

=>1~3행과 모든열 반환

grade[1:2, c(1,3)]

=>1~2행 과 1열 3열 을 같이 선택해서 추출

grade[1:3, c(1:3, 5, 7)]

=>1~3행과 1~3열, 5열, 7열 에 해당하는값 추출합니다.

grade$TOTAL.VALUE

=>첫번째 열 값들을 모두 불러와서 추출합니다.

grade$TOTAL.VALUE[2:9]

=>2번째 열부터 9번째 열의 값들을 모두 추출합니다.

matrix, data.frame에서 사용하는 함수

length(grade$TOTAL.VALUE)

첫번째 열의 길이를 반환합니다.

mean(grade$TOTAL.VALUE)

첫번째 열의 평균을 반환합니다.

summary(grade)

모든 열 에 대한 서머리를 제공합니다. 평균이 얼마고, 메디안이 얼마고 등등 요약해줍니다...

dim()

데이터프레임의 행과 열의 수

ex) dim(grade) => 4 3

nrow(), ncol(), names()

행의 수, 열의 수 , 열벡터의 이름

ex) nrow(grade), ncol(grade), names(grade)

str() : string이 아니라 structure의 준말이다.......가지가지한다.....

matrix 혹은 data.frame의 구조를 보여줌. 유용하게 써먹자

table(grade[ , "eval"])

"eval"에 대한 도수분포표를 만들어 줌

colSums(grade[ , "score"])

열백터의 합을 계산함

colMeans(grade[ , 2])

열벡터의 평균을 계산함

rowSums()

행 별 합계

rowMeans()

행 별 평균

subset() : 조건에 맞는 행(row)추출

grade.A <- subset(grade, eval == "A")

grade.under90 <- subset(grade, score < 90)

matrix에는 작동하지 않습니다. => data.frame으로 변환해야 합니다.

matirx에서 사측연산: 행과 열의 수가 동일할 때 가능

사칙연산 : 벡터와 같이 대응되는 위치에 있는 요소간에 연산

행렬 곱셈: % * %

 

matrix와 data.frame간의 변환

as.matrix() : matrix로 변환,, 동일한 자료형일 때만 사용가능

data.frame() : data.frame으로 변환

 

(ex)

iris.mat <- as.matrix(iris[ , 1:4])

class(iris.mat)

 

iris.df <- data.frame(iris.mat)

class(iris.df)

 

함수에서 인수로 특정 자료형을 요구할 때 사용 : help(barplot)

 

R리스트

파이썬의 딕셔너리같은놈입니다. 그런데 좀 syntax가 많이 다르니 햇갈리지 않게 주의하세요.

정의

서로 다른 데이터형을 보관할 수 있는 데이터 객체(요소의 길이나 차원도 다를 수 있다: (키, 값) 형태의 데이터)

특징

요소는 이름(키)을 가질 수 있다.

요소는 벡터, 행렬, 배열 DF 등을 취함.

student <- list(성명="홍길동", 학번="1694086", 나이=26, 수강과목=c("데이터마이닝", "확률 및 통계"))

student <- list("홍길동", "169407", 26, c("데이터마이닝", "확률 및 통계"))

 

names(student) <- c("성명", "학번", "나이", "수강과목")

위 2개는 같은 결과를 냅니다.

리스트 오소 접근: [[ ]] 사용

student[[1]], student[["성명"]], student $성명

list내의 첫 번째 저장된 요소 (열 이름이 "성명")반환

만약 student[1]을 사용하면 list형으로 반환

 

R factor형 자료

정의

범주형 자료(Categorical Data)를 말합니다.

factor(x, levels, labels = levels, names)

x

vector of data,

levels

범주형 자료의 수준. 디폴트값은 levels입니다.

names

factor의 각 원소의 이름

mode

항상 "numeric" 입니다.

x <- c("M", "F", "M", "F", "M")

x.fct <- factor(x)

x.fct

=> M F M F M

names(x) <- c("1st", "2nd", "3rd", "4th", "5th")

x.fct <- factor(x, labels = c("Female", "Male"))

table(x.fct)

1차원 분할표 생성

factor는 Labels 순서대로 숫자(1,2,3,..)로 변환 가능

n.fct <- as.numeric(x.fct)

n.fct

 

R데이터 입출력: CSV파일

CSV파일

(comma separated values) 값 사이를 콤마(,)로 구분한 데이터로 구성된 텍스트 파일

read.csv(file, header=TRUE, na.string="NA", stringAsFactor=default.StringASFactors())

file은 읽을 파일명(setwd()에서 지정한 폴더 혹은 path + filename)

data.df <- read.csv(file="D:/Rdata/input.csv", header=TRUE)

str(data.df)

header는 파일의 첫 행에 대한 헤더 처리 여부(첫번째 행의 열 이름들 입니다), 문자입력은 factor로 변환합니다.

write.csv(data, file="파일명", row.names=F, quote=F)

행 이름을 csv파일에 포함하여 저장할려면 row.names=T (행이름이 없으면 일련번호가 붙습니다.)

write.csv(data.df, file="D:/Rdata/output.csv")

파일 탐색기를 이용해서 입력

data1.df <- read.csv(file.choose(), header=TRIUE)

텍스트파일 입력

text <- read.table(file="D:/Rdata/input.txt", header=T)

write.table(text, file="D:/Rdata/output.txt", quote=FALSE, append=FALSE) #원래 파일이 있으면 덮어쓰기, 없으면 생성, " " 삭제

write.table(text, file="E:/Rdata/output_1.txt", sep=",", quote=FALSE)

sep는 각 열의 구분자. sep=""가 default(각 열이 하나 이상의 공백으로 구분됨)

Excel 파일

install.packages("openxlsx")

library(openxlsx)

midterm <- read.xlsx("grade.xlsx", sheetindex=1)

write.xlsx(midterm, "D:/Rdata/out.xlsx")

 

R 내부 데이터 읽기

data()

data()

R에서 제공하는 내부 데이터 목록 표시

data(quakes)

데이터 세트 불러오기

quakes

데이터 세트 출력

head(quakes, n=10)

앞부분 10개 행 보기

tail(quakes, n=6)

뒷부분 보기

names(quakes)

변수명 보기

str(quakes)

데이터 구조 보기

dim(quakes)

행과 열의 수 보기

View(quakes)

새로운 탭에서 모든 데이터를 보여줍니다.

summary(quakes)

summary(quakes$mag)

 

R 조건문

if(cond) { 
	cond_1 #cond이 참일때 실행할 문장입니다. 

} else { 
    cond_2 #cond이 거짓일 때 실행할 문장입니다. 
    }

 

위의 조건문은 여타 다른 언어들과도 같은 조건문입니다. 하지만 아래는 사뭇 생소합니다.

ifelse { test, # 참, 거짓을 저장한 객체 
	yes, # test 가 참일때 선택할 값 
    	no # test가 거짓일 때 선택할 값 
        }

 

 

 

'데이터 > 데이터마이닝' 카테고리의 다른 글

데이터마이닝 로드맵  (0) 2021.03.21