[데이터 타입]
변수, 스칼라, 벡터, 리스트, 행렬, 배열, 타입판별, 타입변환
1. 변수 |
1) 기초 데이터 타입 - integer : 정수 - numeric : 실수 - character : 문자열 - logical : 논리형(부울형) - complex : 복소수 2) 복합 데이터 구조 타입 - 벡터(vector) - 행렬(matrix) - 데이터프레임(data frame) - 리스트(list) |
2. 스칼라 |
1) 정수, 부동 소수 모두 지원 > a<-2 > b<-2.7 > c<-a+b > c
2) NA(결측치) : 값이 존재하지 않음 > one <- 100 > two <- 75 > three <- 80 > four <- NA > is.na(four) #결측치인지 확인 [1] TRUE 3) NULL : 변수가 초기화 되지 않은 경우 > x <- NULL #대분자로 써야하며 NA와 구분 > is.null(x) #null값인지 확인 4) 문자열 > a <- "hello" # 'hello'가능 > print(a) [1] "hello" 5) 진리값 > TRUE & TRUE [1] TRUE > TRUE | FALSE [1] TRUE 6) 요인(Factor) : 범주형 데이터 > gen <- factor("m", c("m","f")) #gen라는 변수를 출력해보니 값은 m, 이 변수가 가질 수 있는 수준은 m과 f 2개이다. > gen [1] m Levels: m f factor()라는 범주형 함수가 호출되고, factor()안에 주어진 첫번째 인자는 gen변수에 저장되는 값이다. 그리고 이 범주형 변수는 c('m','f')에 표현된 바와 같이 2개의 m과 f가 가능하다. 즉 m과 g중 m이 선택되어 gen에 저장된것. > gen<-factor('g', c('m','f','g')) > gen [1] g Levels: m f g > gen <- factor(c('f','m','f','g')) > gen [1] f m f g Levels: f g m #알아서 순서대로 나온다. 중복된 값이 있을 경우 값을 선택하여 저장 할 수 없다. > nlevels(gen) #levels의 갯수 [1] 3 > levels(gen) [1] "f" "g" "m"
# levels를 직접 바꾸기 > levels ( gen ) <- c ('male ', 'female ') > gen [1] male Levels : male female #순서형 변수로 만들어 주기위해서는 ordered=TRUE를 붙여주거나 ordered()를 사용한다. > ordered(c('b','a','c')) [1] b a c Levels: a < b < c > factor(c('b','a','c'),ordered=TRUE) [1] b a c Levels: a < b < c |
3. 벡터(vector) : 배열과 유사, 한가지 타입의 데이터가 순서대로 저장 |
###정의 # 자동형변환, 숫자 -> 문자 # 벡터 중첩 : 벡터안에 벡터를 정의하면 단일 차원의 벡터로 변경 > c(1,2,3,c(1,2,3)) [1] 1 2 3 1 2 3 # 숫자형은 start:end구조 가능 > x <- 1:10 > x [1] 1 2 3 4 5 6 7 8 9 10 # seq(from, to, by)형태 가능 > seq(1,10,2) [1] 1 3 5 7 9 #홀수 > seq(2,10,2) [1] 2 4 6 8 10 #짝수 # names() 벡터의 각 셀에 이름을 부여할 수 있다. > x <- c(1,3,4) > names(x) <- c("kim", "lee", "park") > x kim lee park 1 3 4
###벡터내 데이터 접근 > x<-c("a","b","c","e","d") > x [1] "a" "b" "c" "e" "d" #2번째 원소 출력(1,2,3... 순서임!) > x[2] [1] "b" #3번째 원소 빼고출력 > x[-3] [1] "a" "b" "e" "d" #1,3,5번 원소 출력 > x[c(1,3,5)] [1] "a" "c" "d" #1~4까지 원소 출력 > x[1:4] [1] "a" "b" "c" "e" #이름부여 > x<-c(1,3,4) > names(x) <- c('kim','lee','park') > x kim lee park 1 3 4 #lee요소만 출력 > x['lee'] lee 3 #kim, lee 요소만 출력 > x[c('kim','lee')] kim lee 1 3 #이런건 없음.. > x[-'park'] Error in -"park" : invalid argument to unary operator #이렇게 순서를 적으면 3번째 요소 빼고 출력 > x[-3] kim lee 1 3 #벡터 길이 출력 > x <- c("a","b","c") > length(x) [1] 3 # 행렬에서만 가능한 행의 수 출력 > nrow(x) NULL # 대문자!!!! 행렬, 벡터에서 모두 가능한 행의 수 출력, 벡터에서는 n행 1열로 생각해서 출력한다. > NROW(x) [1] 3
###벡터의 연산 # %in% 문자가 포함되어 있는지 > "a" %in% c("b","a","c") #a라는 문자가 벡터에 포함되어 있는지 [1] TRUE > "d" %in% c("b","a","c") [1] FALSE ##집합연산 #차집합 > setdiff(c("a","b","c"), c("a","d")) [1] "b" "c" #합집합 > union(c("a","b","c"), c("a","d")) [1] "a" "b" "c" "d" #교집합 > intersect(c("a","b","c"), c("a","d")) [1] "a" #집합이 같은지 확인 > setequal(c("a","b","c"), c("a","d")) [1] FALSE > setequal(c("a","b","c"), c("a","b","c","c")) [1] TRUE #rep함수 - rep(from, to, 반복횟수) > rep(1:2, 3) [1] 1 2 1 2 1 2 #each=3 각각 반복 > rep(1:2, each=3) [1] 1 1 1 2 2 2 |
4. 리스트 : 서로 다른 데이터 타입 저장 가능, (키, 값)형태, (키=값, 키=값,...) |
#(키, 값)형태의 데이터 > x<-list(name="foo", height=70) > x $name [1] "foo" $height [1] 70 > x<-list(name="foo", height=c(1,2,4)) > x $name [1] "foo" $height [1] 1 2 4 #리스트내의 리스트 > list(a=list(val=c(1,2,3)), b=list(val=c(1,2,3,4))) $a $a$val [1] 1 2 3 $b $b$val [1] 1 2 3 4 #리스트내의 데이터 접근(x$key, x[index], x[[index]]) > x <- list(name="lee", height=c(3,4,5)) > x $name [1] "lee" $height [1] 3 4 5 #key를 이용한 접근 > x$name [1] "lee" > x$height [1] 3 4 5 # 값이 아니라 1개의 원소를 갖는 서브리스트 반환 > x[1] $name [1] "lee" # 값을 가져오기 위한 형태 > x[[2]] [1] 3 4 5 |
5. 행렬 : 2차원 벡터, 원소의 타입이 동일 데이터 형 |
### 행렬 만들기 > matrix(c(1,2,3,4,5,6,7,8,9), nrow=3) [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 > matrix(c(1,2,3,4,5,6,7,8,9), ncol=3) [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 #행별로 순서가 정해지게 > matrix(c(1,2,3,4,5,6,7,8,9), nrow=3, byrow=T) [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9 #행렬에 이름 붙이는 방법(1), 한번에 > matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3, dimnames=list(c("item1","item2","item3"),c("feature1","feature2","feature3"))) feature1 feature2 feature3 item1 1 4 7 item2 2 5 8 item3 3 6 9 #행렬에 이름붙이는 방법(2), 따로따로 > 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 > rownames(x) <- c('r1','r2','r3') > colnames(x) <- c('c1','c2','c3') > x c1 c2 c3 r1 1 4 7 r2 2 5 8 r3 3 6 9 > x<-matrix(c(2:10), nrow=3, byrow = TRUE, dimnames = list(c("r1","r2","r3"), c("c1","c2","c3"))) > x c1 c2 c3 r1 2 3 4 r2 5 6 7 r3 8 9 10 ###행렬 데이터 접근 # 행과 열 번호로 접근 : 1부터 시작한다. > x[1,1] [1] 2 > x[1,2] [1] 3 #원소하나하나씩 말고 행별로 열별로 가져올 수 있다. > x[-3,] c1 c2 c3 r1 2 3 4 r2 5 6 7 > x[1:2,] c1 c2 c3 r1 2 3 4 r2 5 6 7 > x[,2:3 ] c2 c3 r1 3 4 r2 6 7 r3 9 10 > x[c(2:3), c(1:2)] c1 c2 r2 5 6 r3 8 9
# 행과 열 이름으로 접근 # 행이 item1인 열값 출력 > x["item1",] fe1 fe2 fe3 1 4 7
> x fe1 fe2 fe3 item1 1 4 7 item2 2 5 8 item3 3 6 9 # 2번째 컬럼의 값이 5보다 큰 값 출력 > x[x[,2] >= 5,] fe1 fe2 fe3 item2 2 5 8 item3 3 6 9 # 행렬의 연산 > x <- matrix(c(1:9), nrow = 3) > x [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 > x*2 #각 원소값들을 2씩 곱한것 [,1] [,2] [,3] [1,] 2 8 14 [2,] 4 10 16 [3,] 6 12 18 > x #다시 원래 원소값으로 돌아오고 [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 > x/2 #원래 원소값에서 2나눈 값 [,1] [,2] [,3] [1,] 0.5 2.0 3.5 [2,] 1.0 2.5 4.0 [3,] 1.5 3.0 4.5
#행렬의 연산 > x<-matrix(c(1:9), nrow = 3) > x+x [,1] [,2] [,3] [1,] 2 8 14 [2,] 4 10 16 [3,] 6 12 18 > x [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 > x-x [,1] [,2] [,3] [1,] 0 0 0 [2,] 0 0 0 [3,] 0 0 0 > x [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 > t(x) #전치 행렬(행과 열을 바꾸는 것) [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9 #행과 열의 개수 구하기 > x<-matrix(c(1:6), ncol=3) > x [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 > ncol(x) #열의 갯수 [1] 3 > nrow(x) #행의 갯수 [1] 2 6. 배열 : 2차원 이상의 행렬 교재p.53~~ |
7. Data Frame : R에서 가장 중요한 자료형, DB의 테이블과 같은 형태를 가진다. |
#한번에 데이터 프레임에 넣는 방법 > d<- data.frame(x=c(1,2,3,4,5), y=c(2,4,6,8,10)) > d x y 1 1 2 2 2 4 3 3 6 4 4 8 5 5 10 #위와 같은 결과값이 나온다. 따로따로 넣는 방법 > x <- c(1:5) > y <- seq(2,10,2) > k <- data.frame(x,y) > k x y 1 1 2 2 2 4 3 3 6 4 4 8 5 5 10 #data frame은 데이터 타입이 달라도 된다. > d<-data.frame(x=c(1:5), y=seq(2,10,2), z=c('M','F','M','F','M')) > d x y z 1 1 2 M 2 2 4 F 3 3 6 M 4 4 8 F 5 5 10 M #data frame의 구조 > str(d) 'data.frame': 5 obs. of 3 variables: $ x: int 1 2 3 4 5 $ y: num 2 4 6 8 10 $ z: Factor w/ 2 levels "F","M": 2 1 2 1 2 #만들어진 데이터 프레임에 새 열을 추가할 때 '$열이름 <- ' 을 이용한다. > d x y z 1 1 2 M 2 2 4 F 3 3 6 M 4 4 8 F 5 5 10 M > d$v <- seq(3,15,3) > d x y z v 1 1 2 M 3 2 2 4 F 6 3 3 6 M 9 4 4 8 F 12 5 5 10 M 15
#컬럼의 이름으로 접근할 수 있다. > d$x [1] 1 2 3 4 5 > d$z [1] M F M F M Levels: F M #위치를 지정하여 접근 할 수 있다. > d[1,2] [1] 2 #x 컬럼이 3보다 큰 행을 출력 > d[d$x>3,] x y z v 4 4 8 F 12 5 5 10 M 15 #컬럼명을 지정하여 접근할 수 있다. > d[,c("x")] [1] 1 2 3 4 5 #한 컬럼만 선택시 벡터처럼 출력되는데 이것을 방지 하기 위함 > d[,c("x")] [1] 1 2 3 4 5 > d[,c("x"), drop=FALSE] x 1 1 2 2 3 3 4 4 5 5 #rownames(), colnames()를 통해 행과 열에 이름을 부여 > x<-data.frame(1:3) > x X1.3 1 1 2 2 3 3 > colnames(x) <- c('val') > x val 1 1 2 2 3 3 > rownames(x) <- c('a','b','c') > x val a 1 b 2 c 3 |
타입판별, 변환 |
# 타입 판별 > class(c(1,2)) [1] "numeric" > class(list(1,2)) [1] "list" > class(data.frame(x=c(1,2))) [1] "data.frame" > is.numeric(c(1,2,3)) [1] TRUE > is.matrix(matrix(c(1,2))) [1] TRUE #행렬이나 리스트를 데이터 프레임으로 변환 > x<-data.frame(matrix(c(1:4), ncol=2)) > x X1 X2 1 1 3 2 2 4 > colnames(x) <- c("X","Y") > x X Y 1 1 3 2 2 4 ##as.numeric, as.factor등의 함수를 사용한 형 변환이 가능하다. > x<-c("m","f") > as.factor(x) #벡터를 factor로 변환 [1] m f Levels: f m > as.numeric(as.factor(x)) #factor를 숫자형벡터로 변환 [1] 2 1 > factor(c("m","f"), levels=c("m","f")) #levels의 순서를 "m,f"로 하고 싶다면 강제로 지정 [1] m f Levels: m f **factor는 그냥 넣거나 ordered사용하거나 강제 지정하면 순서대로 나오고, 값이 이미 있거나 하면 그대로 출력된다. |
'학부 정리 > 4학년' 카테고리의 다른 글
[4학년 - 빅데이터기술] R프로그래밍 (0) | 2018.04.22 |
---|---|
[4학년 - 빅데이터기술] R프로그래밍 (0) | 2018.04.21 |
[4학년 - 빅데이터기술] R프로그래밍 (0) | 2018.04.21 |
[4학년 - 빅데이터기술] R프로그래밍 (0) | 2018.04.21 |
[4학년 - 빅데이터기술] R프로그래밍 (0) | 2018.04.20 |