통계R 벡터연산 및 자료형
R의 변수 및 데이터구조
변수타입 , 데이터구조
일반적으로 R에서 다루는 모든것이 자료형과 자료구조이다. 이중에서 R에서 더이상 쪼갤 수 없는 원자수준의 개념이 변수타입으로 보고, 이 들을 묶어놓은 객체를 데이터 구조로 이해하면 좋을것 같다
원자 자료형이라는 것은 벡터가 한가지 자료형 데이터만 담는다는 의미이다.
변수타입 | 의미 | 비고 | 판별 |
---|---|---|---|
Numeric | 실수 | 연산가능 ,as.factor(), 2/1.5 | is.numeric(x) |
Integer | 정수 | 연산가능, as.integer(), 2L/3L | is.integer(x) |
Complex | 복소수 | 연산가능, as.complex(), 1+5i | is.complex(x) |
Character | 문자 | 연산불능, as.character | is.character(x) |
Logical | 논리 | 연산불능, as.logical, TRUE/FALSE | is.logical(x) |
Factor | 범주 | 연산불능 ,as.factor() | is.factor(x) |
Date | 날짜 | 연산불능, as.Date | is.date(x) |
데이터구조 | 차원 | 비고 | 판별 |
---|---|---|---|
Vector | 1 | 한가지변수타입 | is.vector(x) |
Dataframe | 2 | 다양한변수타입 -> 대부분 데이터 분석에 사용 | is.data.frame(x) |
Matirx | 2 | 한가지변수타입 | is.matrix(x) |
Array | 다차원 | 동일한구조, 2차원이상Matrix | is.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();
댓글남기기