DBILITY

R data type vector, factor, list ( 벡터, 팩터, 리스트 ) 본문

statistics/R

R data type vector, factor, list ( 벡터, 팩터, 리스트 )

DBILITY 2018. 11. 19. 18:45
반응형

R은 벡터 단위로 데이터처리, 병렬처리가 기본이다.

변수는 알파벳, 숫자, _, .으로 구성할 수 있으며, 할당연산자는 <-, = 이다.

NA(Not Available)는 상수로 결측치(누락값,알수없음)를 나타내며, 결측치와 어떠한 연산을 해도 결측치,NA가 된다. is.na() 함수로 확인할 수 있다.

NULL은 초기화되지 않은 값을 나타내며(value is undefined), NULL과 어떠한 연산을 해도 NULL이 된다. is.null() 함수로 확인할 수 있다.

 

변수 x에 숫자벡터 1,2,3을 할당하는 예제, 실행 결과가 포함되어 있다.참고로 스칼라는 크기가 1인 벡터와 같다.

> x<-c(1,2,3)
> x
[1] 1 2 3
> x<-"Hello R~"
> x
[1] "Hello R~"

함수 예제, 실행 결과가 포함되어 있다.

> y<-function(a,b,c=0,d=2){
+   return (a+b+c+d)
+ }
> y(1,2,3)
[1] 8
> y(1,2,3,NA)
[1] NA
> y(1,2,3,NULL)
numeric(0)
> is.function(y)
[1] TRUE

 

범주(category)형 타입[factor]은 범위가 정해져 있으며,분류 가능한 항목들의 집합으로,명목형과 순서형이 있다. 
ER모델링에서 1차 정규화시 분리되는 엔티티의 반복 속성값이나 java Enumeration을 떠올리면 되겠다. 아니면 말고

{대,중,소} 나 {사과,배,감} 등은 비교가 불가한 데이터로 이들은 나열한 것으로 말 그대로 이름의 목록을 나열한 것이 명목형이다.

> grade<-factor('중',c('대','중','소'))
> grade
[1] 중
Levels: 대 중 소
> nlevels(grade)
[1] 3
> levels(grade)
[1] "대" "중" "소"
> levels(grade)[3]
[1] "소"
> grade<-factor('중',c('대','중','소'),ordered=TRUE)
> grade
[1] 중
Levels: 대 < 중 < 소
> levels(grade)<-c('1','2','3')
> levels(grade)[1]
[1] "1"
> grade<-ordered('중',c('대','중','소'))
> grade
[1] 중
Levels: 대 < 중 < 소

 

벡터는 배열형태로 동일한 데이터 타입만 저장 가능하고, c() 함수로 생성한다.

혼합된 데이터타입이 입력될 경우 형변환이 일어나며 정수<실수<문자로 자동변환이 이루어진다.

벡터내에 벡터가 요소로 포함되더라도 1차원 벡터로 변환된다.

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

 

벡터의 요소에 접근은 인덱스나 이름을 통해 가능하다.

names()함수로 벡터의 각 요소에 이름을 줄 수 있다.

[[인덱스]] 형태로 값만 취할수 있다.

x<-c(1,2,3)
> names(x)<-c('a','b','c')
> x
a b c 
1 2 3 
> x[2]
b 
2 
> x["b"]
b 
2 
> x[c(1,3)]
a c 
1 3 
> x[[3]]
[1] 3
> names(x)[2]
[1] "b"
> length(x)
[1] 3
> nrow(x)
NULL
> NROW(x)
[1] 3

 

벡터비교는 ==,identical(), setequal() 함수를 통해 가능하다. setequal은 벡터를 집합으로 처리하고 동일요소가 존재하는지 비교한다.

== 사용시 주의할 점은 첫번째 요소만 비교한다는 것이다.

> identical(c(1,2),c(1,2,3))
[1] FALSE
> identical(c(1,2),c(1,2,2))
[1] FALSE
> setequal(c(1,2),c(1,2,3))
[1] FALSE
> setequal(c(1,2),c(1,2,2))
[1] TRUE
> if(c(1,2)==c(1,10)) {
+   print("equal")
+ }
[1] "equal"
Warning message:
In if (c(1, 2) == c(1, 10)) { :
  the condition has length > 1 and only the first element will be used
> if(identical(c(1,2),c(1,10))) {
+   print("equal")
+ } else {
+   print("not equal")
+ }
[1] "not equal"

 

벡터내에 특정 값이 존재하는지는 %in% 연산자로 처리한다.

> 3 %in% c(1,2,3,4,5)
[1] TRUE
> 6 %in% c(1,2,3,4,5)
[1] FALSE

 

seq함수는 순차벡터를 생성(sequence generation)한다. seq(from, to, by, length.out, along.width) 형태로 정의하며, 각각 시작값, 종료값, 증감값, 결과벡터길이,벡터길이만큼 실행을 나타낸다.

length.out은 숫자를 입력하고,along.width는 벡터를 입력합니다. 결과는 같습니다.

seq_along함수는 1부터 시작하여 인수로 공급된 벡터의 길이까지 시퀀스를 생성합니다.

: 시퀀스연산자로 1:5의 표현식은 1부터 5까지 1씩 증가하며 생성한다는 것.

> 1:5
[1] 1 2 3 4 5
> seq(1,5)
[1] 1 2 3 4 5
> seq(1,5,1)
[1] 1 2 3 4 5
> seq(1,5,length.out =  5)
[1] 1 2 3 4 5
> seq(1,5,along.with = c(5:1))
[1] 1 2 3 4 5
> x<-seq(1,10,2)
> x
[1] 1 3 5 7 9
> seq(1,10)
 [1]  1  2  3  4  5  6  7  8  9 10
> 1:10
 [1]  1  2  3  4  5  6  7  8  9 10
> x<-c(seq(1,10,2))
> x
[1] 1 3 5 7 9
> 1:NROW(x)
[1] 1 2 3 4 5
> seq_along(x)
[1] 1 2 3 4 5
> seq_along(10000)
[1] 1
> seq_along(c(1:10))
 [1]  1  2  3  4  5  6  7  8  9 10
> seq_len(10)
 [1]  1  2  3  4  5  6  7  8  9 10
> seq(1,10,length.out = 2)
[1]  1 10
> seq(1,10,length.out = 3)
[1]  1.0  5.5 10.0
> seq(1,10,along.with = c(1,2,3,4,5))
[1]  1.00  3.25  5.50  7.75 10.00
> seq(1,10,length.out = 5)
[1]  1.00  3.25  5.50  7.75 10.00

 

rep함수는 인수로 지정한 벡터의 복제를 실행한다. req(c(), times, each) 형태로 정의하며, 각각 벡터,벡터복제회수,요소별 복제회수를 나타낸다. 뭔말이지?!

> rep(c(1,2,3,4,5),times=2)
 [1] 1 2 3 4 5 1 2 3 4 5
> rep(c(1,2,3,4,5),times=2,each=2)
 [1] 1 1 2 2 3 3 4 4 5 5 1 1 2 2 3 3 4 4 5 5
> length(rep(c(1,2,3,4,5),times=2,each=2))
[1] 20

 

벡터는 동일한 데이터형식만 저장이 가능했다. 다른 데이터형식끼리 저장이 불가능하다면 어쩌라고?

 

리스트형이 존재하고, R의 리스트형은 key,value형태로 정의한다.

[[]] 대괄호 두개에 인덱스를 입력하면 리스트의 값만 참조할 수 있다.

> x<-list(name="가가가", sex="아저씨")
> x
$`name`
[1] "가가가"

$sex
[1] "아저씨"

> x<-list(name=c("가가가","나나나","다다다"), sex=c("아저씨","아줌마","꼬맹이"))
> x
$`name`
[1] "가가가" "나나나" "다다다"

$sex
[1] "아저씨" "아줌마" "꼬맹이"
> x$name[1]
[1] "가가가"
> x$sex[3]
[1] "꼬맹이"
> x[1]
$`name`
[1] "가가가" "나나나" "다다다"

> x[[1]]
[1] "가가가" "나나나" "다다다"
> x[[2]][3]
[1] "꼬맹이"

> y<-list(name=c('가가가','나나나','다다다'),value=list(val=c('아저씨','아줌마','꼬맹이')))
> y
$`name`
[1] "가가가" "나나나" "다다다"

$value
$value$`val`
[1] "아저씨" "아줌마" "꼬맹이"

> y[[1]]
[1] "가가가" "나나나" "다다다"
> y[[1]][1]
[1] "가가가"
> y$name[1]
[1] "가가가"
> y[[2]]
$`val`
[1] "아저씨" "아줌마" "꼬맹이"

> y$value
$`val`
[1] "아저씨" "아줌마" "꼬맹이"

> y$value[1]
$`val`
[1] "아저씨" "아줌마" "꼬맹이"

> y$value[1][1]
$`val`
[1] "아저씨" "아줌마" "꼬맹이"

> y$value[1]$val
[1] "아저씨" "아줌마" "꼬맹이"
> y$value[1]$val[3]
[1] "꼬맹이"
> y<-list(name=c('가가가','나나나','다다다'),value=list(val=c('아저씨','아줌마','꼬맹이'),val2=c('10','20','30')))
> y
$`name`
[1] "가가가" "나나나" "다다다"

$value
$value$`val`
[1] "아저씨" "아줌마" "꼬맹이"

$value$val2
[1] "10" "20" "30"


> y[[1]][1]
[1] "가가가"
> y$name[1]
[1] "가가가"
> y[[1]]
[1] "가가가" "나나나" "다다다"
> y[[2]]
$`val`
[1] "아저씨" "아줌마" "꼬맹이"

$val2
[1] "10" "20" "30"

> y[[2]][1]
$`val`
[1] "아저씨" "아줌마" "꼬맹이"

> y[[2]][2]
$`val2`
[1] "10" "20" "30"

> y$value[1]$val[3]
[1] "꼬맹이"
> y$value[2]
$`val2`
[1] "10" "20" "30"

> y$value[2]$val2
[1] "10" "20" "30"

> y$value[2]$val2[1]
[1] "10"

 

반응형
Comments