파이썬과는 다른 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 |
---|