R 언어 # chapter02_ 데이터의 유형과 구조_Data Frame
5. Data Frame 자료 구조
R programming에서 가장 많이 사용되는 Data Frame
정형의 데이터를 보관하는 데이터베이스의 테이블. 테이블 포멧. 데이터에 대한 접근과 관리가 용이.
테이블과 행렬의 차이점. 배열은 데이터 자료형 모두 동일, 반면 테이블은 컬럼 별로 데이터 다양하게 저장 가능.
벡터 이용 객체 생성
no <- c(1, 2, 3)
name <- c("홍길동","이순신","강감찬")
pay <- c(150,250,300)
vemp <- data.frame(No=no,Name=name,Pay=pay) #테이블 컬럼의 이름 No, Name, Pay
vemp
class(vemp) # "data.frame"
matrix 이용 객체 생성
args(matrix)
m <- matrix(c(1, "홍길동", 150,2,"이순신",250,3,"강감찬",300), 3, by=T) #by=T byrow약자. 구별할 수 있으면 매개변수 다 안써도 가능. 3행 행 중심으로 채워라.
m
class(m) # "matrix"
memp <- data.frame(m)
memp
class(memp) # "data.frame"
txt 파일 이용 객체 생성
getwd() # R의 작업 디렉토리 위치.
setwd("c:/workspaces/Rwork/data") #실행할 때만 해당. 지속하려면 global로
txtemp <- read.table('emp.txt', header = T, sep = "") #header 첫번째 항목은 컬럼이름으로, sep 데이터 구분단위 여백으로 지정.
txtemp
class(txtemp) # "data.frame"
csv 파일 이용 객체 생성(header=T)
csvtemp <- read.csv('emp.csv', header = T) #csv ,(콤마)단위로 seperate.
csvtemp; class(csvtemp)#[1] "data.frame"
?read.csv() # utils패키지. Reads a file in table format and creates a data frame
csv 파일 이용 객체 생성(header=F)
name <- c("사번", "이름", "급여")
csvtemp2 <- read.csv('emp2.csv', header = F, col.names = name) #헤더 없음. col.names로 헤더 정보 부여
csvtemp2
데이터프레임 만들기
df <- data.frame(x=c(1:5),y=seq(2,10,2),z=c('a','b','c','d','e'))
df
데이터프레임 컬럼명 참조
df$x #해당 컬럼의 데이터를 읽어오고 싶을 때. x컬럼 항목 출력.
자료구조, 열수, 행수, 컬럼명 보기
str(df) #자료 구조 정보. 'data.frame': 5 obs. (objects. 객체. 행) of 3 variables: (3개의 변수, 특징 feature, 컬럼 갯수)
ncol(df)
nrow(df)
df[c(2:3)]
요약 통계량 보기
summary(df)
#최댓값, 최소값, 평균(Mean),
#1st Qu.(1사분위 : 시작과 끝의 값을 1/4 했을때 1/4 범위에 있는 값),
#Median (2사분위 : 2/4 값 , 중위수 : 주어진 데이터셋에서 가장 가운데 있는 값.),
#3rd Qu.(3사분위 :' 3/4 값)
#요약 통계량(summary)은 수치일때 의미를 가지는 개념. 자료형이 문자일경우 Class와 Mode로 자료형에 대한 info만 보여준다.
데이터프레임 자료에 함수 적용
apply(df[,c(1,2)], 2, sum) # df의 모든 행의 1열과 2열 , 컬럼 단위로(1일때는 행 단위로), 더해라
데이터프레임의 부분 객체 만들기
x1 <- subset(df, x >= 3) # x가 3이상인 레코드 대상 #subset 부분집합. 전처리에서 유용하게 활용되는 함수.
x1
y1 <- subset(df, y <= 8) # y가 8이하인 레코드 대상
y1
두 개의 조건으로 부분 객체 만들기
xyand <- subset(df, x>=2 & y<=6)
xyand
xyor <- subset(df, x>=2 | y<=6)
xyor
student 데이터프레임 만들기
sid <- c('A','B','C','D')
score <- c(90, 80, 70, 60)
subject <- c('컴퓨터', '국어국문', '소프트웨어', '유아교육')
student <- data.frame(sid, score, subject)
student
자료형과 자료구조 보기
mode(student); class(student) # list (key-value 형태), data.frame
str(sid); str(score); str(subject)
str(student)
두 개 이상의 데이터프레임 병합하기
height <- data.frame(id=c(1,2), h=c(180, 175))
weight <- data.frame(id=c(1,2), w=c(80,75))
height; weight
person <- merge(height, weight, by.x="id", by.y="id") #by.으로 병합의 조건 설정.
person
galton 데이터 셋 가져오기
#install.packages("psych") # 패키지 설치
#library(psych) # 패키지 메모리에 로드
install.packages("UsingR") # 패키지 설치
library(UsingR) # 패키지 메모리에 로드
data("galton") # galton 데이터 셋 가져오기
galton 데이터 셋 구조 보기
str(galton)
dim(galton)
head(galton, 20) #상위 20개의 데이터 출력
head(galton) # default 갯수:6
6. 문자열 처리
비정형 데이터의 상당수가 문자열 데이터. 유의미한 결과를 얻기위해 전처리 과정에서 데이터 조작, 병합, 필터링의 수행이 일반적.
문자열 추출하기
install.packages("stringr") # 패키지 설치
library(stringr) # 메모리 로딩
형식) str_extract('문자열', '정규표현식')
str_extract("홍길동35이순신45강감찬50","[0-9]{2}") # 연속된 숫자2개가 첫번째 발견 항목
str_extract_all("홍길동35이순신45강감찬50","[0-9]{2}")
반복수를 지정하여 영문자 추출
string <- 'hongkildong105lee1002you25강감찬2005'
str_extract_all(string, '[a-z]{3}') # 알파벳 연속 3개
str_extract_all(string, '[a-z]{3,}') # 3회 이상
str_extract_all(string, '[a-z]{3,5}') # 3회 이상 5회 이하
특정 단어 추출
str_extract_all(string, '유관순')
str_extract_all(string, '강감찬')
한글, 영문자, 숫자 추출하기
str_extract_all(string, 'hong')
str_extract_all(string, '25')
str_extract_all(string, '[가-힣]{3}') # 한글 검색
str_extract_all(string, '[a-z]{3}') # 소문자 검색
str_extract_all(string, '[A-Z]{3}') # 대문자 검색
str_extract_all(string, '[0-9]{4}') # 숫자 검색
한글, 영문자, 숫자를 제외한 나머지 추출하기
str_extract_all(string, '[^a-z]') # 알파벳 소문자 제외 나머지 추출
str_extract_all(string, '[^a-z]{4}') # 연속 4개
str_extract_all(string, '[^가-힣]{5}') # 한글 제외 연속 5개
str_extract_all(string, '[^0-9]{3}')
주민등록번호 검사하기
jumin <- '123456-3234567'
str_extract_all(jumin, '[0-9]{6}-[1234][0-9]{6}') #0-9인 6자리. - 다음 첫자리는 1,2,3,4 중 하나의 값만. 0-9인 6자리
str_extract_all(jumin, '\d{6}-[1234]\d{6}') # '\d(숫자)'로 처리하기 위해 \한 번 더 입력. 위와 같은 결과.
지정된 길이의 단어 추출하기
name <- '홍길동1234,이순신5678,강감찬1012'
str_extract_all(name, '\w{7,}') # '\w'(소문자) : 한글/영문자/숫자 포함. 즉, 특수문자 제외.
str_extract_all(name, '\W') # '\W'(대문자) : 특수문자 선택.
문자열 위치(index) 구하기
string <- 'hongkd105leess1002you25강감찬2005'
str_locate(string, '강감찬')
문자열 길이 구하기
string <- 'hongkild105lee1002you25강감찬2005'
len <- str_length(string) # 30
len
부분 문자열
string_sub <- str_sub(string, 1, len-7) # 1부터 len-7번째까지의 문자열 추출.
string_sub
string_sub <- str_sub(string, 1, 23)
string_sub
대문자, 소문자 변경하기
str_to_upper(string_sub)
str_to_lower(string_sub)
문자열 교체하기
string_rep <- str_replace(string_sub, 'hongkild105', '홍길동35,') #hongkild105를 홍길동35,로 교체
string_rep <- str_replace(string_rep, 'lee1002', '이순신45,')
string_rep <- str_replace(string_rep, 'you25', '유관순25,')
string_rep
문자열 결합하기
string_c <- str_c(string_rep, '강감찬55')
string_c
문자열 분리하기
string_sp <- str_split(string_c, ',') # ,단위로 데이터 분리해 반환
string_sp
문자열 합치기
string_vec <- c('홍길동35', '이순신45', '유관순25', '강감찬55')
string_vec
string_join <- paste(string_vec, collapse = ',') #collapse에 지정해준 데이터를 삽입하며 데이터를 결합.
string_join