- R의 데이터 형 ( = 타입)
- R의 데이터 형은 기본형, 구조형, 복합형으로 나눌 수 있으며, Special Values가 존재함
- 기본형 : numeric, character, logical
- 구조형 : scalar, factor, vector, matrix(행렬) , array
- 복합형 : list(파이썬 리스트랑 똑같음) , data.frame → 목차가있는 행렬 여러개의 타입, data.table : 여러개의 타입을 같이 사용할 수 있는지
- Special Values : NULL(변수값이 초기화 되지 않음), NA(결측치), NaN(계산 불가능, Not Available Number), INF(무한대)
데이터 형 특징 numeric 정수, 실수, 복소수, 수학적 연산 및 통계적 계산 character 문자, 단어로 구성 “”또는 ‘’내에 표현됨 logical TRUE,FALSE, 산술 연산 시 1, 0 으로 사용 됨 데이터 형 차원 원소 원소의 타입 scalar 단일 수치/ 문자/ 논리 단일 factor 1D 수치/ 문자 단일, 범주형 vector 1D 수치/문자/논리 단일 matrix 2D 수치/문자/논리 단일 data.frame 2D 수치/문자/논리 복합 가능 array 2D 이상 수치/문자/논리 단일 list 2D 이상 수치/문자/논리 복합 가능
- vector - c 함수로 생성
- 하나 이상의 스칼라 ( = 길이가 1인 벡터) 원소들을 갖는 단순한 형태의 집합
- 숫자, 문자, 논리형 데이터를 원소(Element)로 사용할 수 있음
- 동일한 자료형을 갖는 값들의 집합으로 하나의 열(Column)로 구성됨
- 벡터 생성 함수 : c(value1, value2,….), seq(from, to, by), rep(x, times, each)
rm(list = ls()) #리스트 목록 삭제 iv <- c(1,2,3) cv <- c('A',"B",'C') bv <- c(TRUE,FALSE,TRUE) fv <- c(3.4,2.5,8) t <- c(1,2,3,4) icv <- c(iv,cv,bv) #원소가 가장 유연한 타입인 chr로 변경 rm(list = ls()) v1 = seq(1:5) #v1 = 1:5 v2 = seq(1,10,2) v3 = seq(1,10,length = 4) #1~10사이의 길이 4짜리 벡터 v4 = seq(1,3,length = 5) #1~3사이의 길이 5짜리 벡터 rm(list = ls()) v1 = rep(1,5) #1을 5번 v2 = rep(1,time = 5) #1을 5번 v3 = rep(3:5, time = 3) #3,4,5를 3번 v4 = rep(3:5, each = 2) # 3,3, 4,4, 5,5 각각 2번씩 반복 v5 = rep(seq(1,5,2),2) #1,3,5,1,3,5 v5 = rep(seq(1,5,2),each = 2) #1,1,3,3,5,5 rm(list = ls()) v1 <- seq(2,10,2) v2 <- rep(2,5) v3 <- v1 + v2 v4 <- v1%/%v2 #몫 구하기 v5 <- v1 ^ v2 #승수 구하기 x <- c(1,4,8) y <- c(2,3) z <- t(y) #전치행렬 y #하나의 열 t(y) #하나의 행 두개의 열 m <- x%*%z #행렬곱 m rm(list = ls()) v1 <- rep(3,7) v2 <- c(1,2,3) v3 <- v1+v2 #재사용 규칙 적용 v4 <- v2 + 3 #재사용 규칙 적용 rm(list = ls()) v1 <- 1:5 #seq(1:5) r1 <- v1[3] r2 <- v1[-3] #3번인덱스의 요소를 제외하고 r3 <- v1[2:4] #2~4인덱스의 요소 r4 <- v1[c(1,3,4)] #1,3,4 번째 요소 r5 <- v1[v1%%2 == 0] #2로 나누었을 때 ,나머지가 0인 요소 v1%%2==0 names(v1) <-c('A',"B","C",'D','E') #v1의 각 요소에이름 붙이기 v1['B'] #동일한 결과 v1[2]
rm(list = ls()) #만들어 놓은 변수의 목록 삭제
ls()
a <- 20 #두가지 방법 모두 가능
b = 20
hap <- a+b
cat(hap,'\n') #합치기
cat(a , '+', b ,'=', hap, '\n')
ls()
rm(hap) #hap 변수 삭제
ls() #변수의 목록
a.list = 10 #변수명에 . 사용가능
a.so = 20
rm(list = ls()) #리스트 목록 삭제
iv <- c(1,2,3)
cv <- c('A',"B",'C')
bv <- c(TRUE,FALSE,TRUE)
fv <- c(3.4,2.5,8)
t <- c(1,2,3,4)
icv <- c(iv,cv,bv) #원소가 가장 유연한 타입인 chr로 변경
rm(list = ls())
v1 = seq(1:5) #v1 = 1:5
v2 = seq(1,10,2)
v3 = seq(1,10,length = 4) #1~10사이의 길이 4짜리 벡터
v4 = seq(1,3,length = 5) #1~3사이의 길이 5짜리 벡터
rm(list = ls())
v1 = rep(1,5) #1을 5번
v2 = rep(1,time = 5) #1을 5번
v3 = rep(3:5, time = 3) #3,4,5를 3번
v4 = rep(3:5, each = 2) # 3,3, 4,4, 5,5 각각 2번씩 반복
v5 = rep(seq(1,5,2),2) #1,3,5,1,3,5
v5 = rep(seq(1,5,2),each = 2) #1,1,3,3,5,5
- matrix(행렬)
- 데이터의 형태가 2차원으로 행(row)과 열(column)로 구성
- 하나의 데이터 유형만 가능, 역행렬은 solve()로 구한다.
- 행렬 생성 함수
- matrix(data = NA, nrow = 1(행의 수), ncol = 1(열의 수), byrow = FALSE(TRUE일 경우 행방향으로 채워짐), dimnames = NULL(각 차원의 이름))
- rbind(vectors or matrices), cbind(vectors or martrices)
- data.frame
- 엑셀의 WorkSheet와 같은 구조의 2차원 데이터
- ‘여러가지 데이터 유형’을 가질 수 있음, 벡터 벼로 다른 데이터 유형 가능
- 벡터가 모여 데이터 프레임을 구성함
- data.frame 생성함수
- data.frame(vectors or matrices, stringsAdFactors) #벡터의 길이는 모두 같아야 함
- data.frame(변수명 = 벡터, .., stringAsFacrots)# stringAsFactors를 TRUE로 지정하면 문자열을 factor형으로 저장함
rm(list =ls())
name <- c('tom','jerry','cindy','mark')
gender <-c('f','m','f','m')
kor <- c(90,100,80,95)
eng <- c(90,95,100,80)
df1 <- data.frame(name, gender,kor,eng)
df2 <- data.frame(matrix(seq(1,9),nrow = 3))
#이름을 별도로 주지 않았으므로 x1,x2,x3로 설정
df3<- data.frame(gender = c('f','m','f','m'),
score = c(90,100,85,95),
stringsAsFactors = TRUE)
str(df3) #structure, gender에 대해서는 factor type
df <- data.frame(name, gender,kor,eng)
v1 = df[1,3] # 1행 3열
df1 <- df[2,] # 2행 모든열, 4obs. of 4 variables
v2 <- df[,'name']
# 열 의 경우 한가지 타입으로 통일 되어 있으므로
# 하나의 vector 반환
v3 <- df$name #df안의 name이라는 열, df[,'name'], vector
df2 <- df[1] #1번 열, dataframe
df3 <- df['name'] #name 열, dataframe
v4 <- df[[1]] #1번열, vector
df4 <- df[seq(1,3),c(1,2)] #data frame
df5 <- df[,2:4] #data frame
df6 <- df[1:3] #여러개의 열, dataframe
df7 <- df[-2] #2번 열 제외 , dataframe
df8 <- df[-c(1,3,4)] #1,3,4열 제외,dataframe
- list
- 서로 다른 데이터 타입을 담을 수 있음
- 리스트에 저장된 데이터를 index 또는 key를 사용해 접근함
- 생성 함수 : list(key = value, key = value … )
- 외부 데이터 사용
- 작업 환경 설정
- setwd(’디렉터리 이름’)
- getwd() : 현재 작업 디렉터리 이름 반환
- CSV 파일 불러오기, 저장하기
- 불러오기 : read.csv(’파일명’, fileEncoding =’UTF-8-BOM’) # fileEncoding → 한글 깨짐방지
- 저장하기 : write.csv(’파일명’, row.names = FALSE) #row.names = FALSE→열 이름 지정x
- 경로명은 \\ or / 으로 경로 구분자를 사용
rm(list = ls()) df = read.csv('.\\data\\easySample.csv',fileEncoding = 'UTF-8-BOM') # fileEncoding = 'UTF-8-BOM'을 통해 깨짐 방지 write.csv(df, 'data/mySample.csv', row.names = FALSE) write.csv(df,'data/mySample_wr.csv', row.names = TRUE) rm(list = ls()) cname <- c('ID','name','birth','dept','english' ,'japanese','chinese') #컬럼명 설정 df3 <- read.table('data/easySample.txt' ,sep = ',' ,col.names = cname) #col.names = 컬럼명 설정, sep =텍스트 파일의 구분자를 알려줌 print(df3) rm(list = ls()) df4 <- read.csv('data/mySample.csv') save(df4, file = 'data/myObject1.Rdata') #객체로저장 rm(list = ls()) ls() #아무것도 없음 확인 load('data/myObject1.Rdata') #객체 불러오기 print(df4)
- 작업 환경 설정
- data.frame 핸들링
- 새로운 변수 만들기 : 데이터프레임$변수명 또는 데이터프레임[’변수명’] < - 추가할 데이터 벡터
- 조건으로 선택 : subset(x, subset = (조건)) #subset = 생략가능
- 목록으로 선택 : subset(x, subset = (조건), select = 열/ 열 목록)
- 열, 열 목록 제거 : subset(x, subset= (조건), select = 열/ -열 목록)
- 열 이름 바꾸기 : colnames(x)< - , colnames(x)[index] < -
- R의 데이터 셋 사용
- x : 데이터 셋 이름, v : 데이터, n : 숫자
- head(x, n) : 데이터 셋 처음 여섯 개 반환, n 지정 시 해당 개수 만큼 반환
- tail(x,n) : 데이터 셋 마지막 여섯개 반환, n 지정 시 해당 개수 만큼 반환
- View(x) : 창을 열고 엑셀과 유사한 형태로 데이터 셋을 보여줌
- summary(x) : 데이터 셋을 구성하는 항목의 기초 통계량을 보여줌
- 최솟값, 1사분위수, 중간값, 평균, 3사분위 수, 최댓값
- str(x) : 데이터의 구성을 표시함
- attach(x) : 데이터 셋을 고정으로 사용하겠다고 선언함, detach할 때 까지 유효변수명만으로 바로 데이터에 접근 가능, iris$Sepal.Width → Sepal.Width
- detach(x) : 고정된 데이터셋 사용을 해제 선언함
- getwd() : 현재 워킹디렉토리 반환, setwd(’경로명’) : 워킹 디렉토리 설정
- head, tail, summary, str : vector, matrix 등의 다양한 객체에 적용 가능
- View : matrix, data.frame, list등 Data 구조에 적용가능
rm(list = ls()) df = read.csv('./data/easySample3.csv') df1 <- df[,c(2,4,8,9)] df1 df1$score <- c(90,80,50,70,100,95,85,70,95,75) #열 추가, 길이 같아야함 df2 <- subset(df1,subset = (salary>=5000) ) #조건에 맞는 행 추출 df3 <- subset(df2,select = -score ) #열에 대해서 목록을 추출 score 열 제외 df4 <- subset(df1, subset = (salary>=5000), select = -score) # salary 5000이상이면서 score열 제거 df5 <- subset(df2, select = c(pname, dept,salary)) # pname, dept, salary 열 선택 colnames(df5)[2] <- 'department' # df5의 2열의 이름 department로 변경
[출처] https://www.youtube.com/c/EduAtoZPythonrm(list = ls()) df = read.csv('./data/easySample3.csv') df1 <- df[,c(2,4,8,9)] df1 df1$score <- c(90,80,50,70,100,95,85,70,95,75) #열 추가, 길이 같아야함 df2 <- subset(df1,subset = (salary>=5000) ) #조건에 맞는 행 추출 df3 <- subset(df2,select = -score ) #열에 대해서 목록을 추출 score 열 제외 df4 <- subset(df1, subset = (salary>=5000), select = -score) # salary 5000이상이면서 score열 제거 df5 <- subset(df2, select = c(pname, dept,salary)) # pname, dept, salary 열 선택 colnames(df5)[2] <- 'department' # df5의 2열의 이름 department로 변경