01. 벡터
- 01 수정
- 02 연산
02. 데이터 프레임
03. 문자열 함수
- 01 대소치환
- 02 문자열 추출
- 03 치환/삭제
- 04. 문자열 결합
- 05 문자열 분리
- 06 NA 치환
- 07 문자열 세기
- 08 문자열 패턴 확인
- 09 문자열 삽입
- 10 연속적인 공백 제거
- 11 문자열 반복
- 12 문자열 위치
- 13 문자열 길이
04. 숫자함수
- 01 round
- 02 trunc
- 03 floor
- 04 ceiling
- 05 abs
- 06 sign
- 07 거듭제곱
05. 집계함수
- 01 sum
- 02 mean
- 03 min
- 04 max
- 05 median
- 06 분산
- 07 표준편차
01. 벡터
- 01 수정
1) 값 수정
숫자의 지속적인 증가를 표시할 수 있으며, 날짜의 연속적인 출력 역시 가능하다.
sep()
seq(from = 1, #시작값
to = 1, #끝값
by = ) #증가값
seq(1,20,2)

v1<-seq(1,20,2)
v1[3:5] <- 100 # 동일한 값으로 수정
v1[7:10] <- seq(100, 400, 100) # 서로 다른 값으로 수정 가능(개수 일치해야 함)

2) 구조 수정 - 원소추가
- 가장 마지막에 원소 추가
v1<- c(v1,500)
v1

- 가장 앞에 원소 추가
v1<- c(600, v1)
v1

- 중간에 원소 추가
append(x, # 원본대상
values, # 삽입대상
after) # 삽입위치
append(v1, 1000, 3)

- 02 연산
v1 * 2 # 벡터와 상수의 연산 가능

var1 <- 1:10
var2 <- seq(10, 100, 10)
var1 + var2 # 벡터끼리 연산 가능(길이가 같아야 함)

var1 + var3 # 경고메시지 출력 (작은쪽 벡터가 반복되어 연산)

02. 데이터 프레임
- 2차원 구조(RDBMS의 테이블과 유사)
- 각 컬럼(열) 별로 서로 다른 데이터 타입 전달 가능
- 하나의 열에는 같은 데이터 타입만 전달 가능
- key-value 자료 구조
- 01 생성
data.frame(..., # 가변형 인수전달 방식(여러개 인수 전달 가능)
row.names = , # 행이름 부여
stringAsFactors = F) # 문자컬럼의 factor 선언
df1<- data.frame(name=c('SMITH','ALLEN','SCOTT'),
sal=c(3000,2000,2500),
comm=c(500,0,200))

# [ 참고 - factor형 ]
R에서 범주형 자료를 위해 만든 데이터 타입이며, 주로 문자로 되어있고 특정 범주(클래스)로만 구성된 자료의 형태이다.
factor로 선언된 변수는 선언시 존재한 범주 외의 값으로 삽입/수정이 불가능하다.
v1 <- c('A','B','C','D')
v2 <- as.factor(c('A','B','C','D'))
v1[1] <- 'E'
v1 # 정상

v2[1] <- 'E'

v2 # 경고(E가 레벨값이 아니라서 NA로 들어감)

03. 문자열 함수
# 참고 - 함수 사용 방법
1. R에는 각 인수의 이름이 정해져 있음
2. 정해진 순서대로 빠짐없이 모든 인수를 전달 시 인수이름 생략 가능
3. 중간 인수를 생략하고 뒤의 인수를 전달할 때는 인수이름과 함께 전달
substr(x=, start=, stop=)
substr('abcde',2,4)
substr(x='abcde',start=2,stop=4)

# ** 함수 목록 확인
ls() # 현 세션에 정의된 모든 변수 목록
ls('package:stringr') # stringr 패키지 안의 함수 목록
ls('package:base') # 기본 내장 함수 목록
# ** 현재 세션에 정의된 변수 삭제
sum <- 10
rm(... ,
list = )
rm('sum') # 특정변수 삭제
rm(list = ls())
- 01 대소치환
str_to_upper('abcde') # 대문자 변환
str_to_lower('ABCDE') # 소문자 변환
str_to_title('ABCDE') # camel 표기법 변환

emp <- read.csv('emp.csv')
emp$ENAME <- str_to_lower(emp$ENAME)
emp

- 02 문자열 추출
stringr::str_sub(string = , start = 1, end = -1) # 패키지명 기재시 패키지를 따로 부착하지 않아도 함수가 실행된다.
str_sub(string = , start = , end = )
str_sub('abcde', 1, 3)
substr('abcde', 1, 3)

str_sub('abcde', -2)
substr('abcde', -2)

예) emp 테이블에서 입사년도를 추출하시오.
substr(emp$HIREDATE, 1, 4)
str_sub(emp$HIREDATE, 1, 4)

예) emp 테이블에서 근속연수를 출력하시오.
2026 - as.numeric(str_sub(emp$HIREDATE, 1, 4))

- 03 치환/삭제
str_replace(string = , # 원본문자열
pattern = , # 찾을문자열(정규식 전달 가능, 문자타입만 전달 가능)
replacement = ) # 바꿀문자열(생략불가, 빈문자열 전달 시 삭제됨)
str_remove(string = , # 원본문자열
pattern = ) # 제거문자열(정규식 전달 가능, 문자타입만 전달 가능
str_replace('abcabc', 'a', ' ') # a 한 번만 삭제
str_replace_all('abcabc','a','') # a 전체 삭제

예) professor.csv 파일을 불러온 뒤, ID에서 1을 삭제하시오.
str_replace(pro$ID, '1', '')

예) professor.csv 파일을 불러온 뒤, ID에서 모든 숫자를 삭제하시오.
* R에서는 정규표현식 표현에 ' \ ' 를 하나 더 붙여준다.
str_replace_all(pro$ID, '[0-9]', '')
str_replace_all(pro$ID, '\\d', '')

예) professor.csv 파일을 불러온 뒤, ID에서 모든 특수기호를 삭제하시오.
str_replace_all(pro$ID, '[[:punct:]]','')

예) professor.csv 파일을 불러온 뒤, NAME에서 두번째 글자를 X로 치환하시오.
str_replace(pro$NAME, substr(pro$NAME, 2, 2), 'X')

- 04. 문자열 결합
str_c(..., # 가변형 인수전달(여러개 나열)
sep = "", # 분리구분 기호(각 문자열을 결합)
collapse = NULL) # 분리구분 기호(벡터 내부 결합)
str_c('a', 'b', 'c', 'd') # "abcd"
str_c('a', 'b', 'c', 'd', sep = '/') # "a/b/c/d"

str_c(c('a','b','c','d')) # "a" "b" "c" "d" (결합x)
str_c(c('a','b','c','d'), collapse = '') # "abcd"
str_c(c('a','b','c','d'), collapse = '/') # "a/b/c/d"

예) emp 테이블을 활용하여 다음과 같이 출력하시오.
('SMITH의 10% 인상된 급여는 880이다.' 매 행마다 각 데이터를 반영하여 반복)
str_c(emp$ENAME, '의 10% 인상된 급여는 ', (emp$SAL * 1.1), '이다.')

- 05 문자열 분리
str_split(string =, # 원본문자열
pattern = ) # 분리구분기호(정규식 전달 가능)
str_split('a@b@c@d', '@') # 리스트로 출력
str_split(c('a@b@c@d', 'A@B@C') ,'@')
# 첫번째 원소의 결과는 첫번째 층 안의 벡터로 전달, 두번째 원소의 결과는 두번째 층 안의 벡터로 전달

c1<- str_split(c('a@b@c@d', 'A@B@C') ,'@')
class(c1)
c1[[1]]
c1[[1]][3]

- 06 NA 치환
str_replace_na(string = , # 원본문자열
replacement = "NA") # NA 치환값(문자타입만 전달가능)
emp$COMM
str_replace_na(emp$COMM)
str_replace_na(emp$COMM, 0) # error (치환값은 숫자 전달 불가)

as.numeric(str_replace_na(emp$COMM, '0'))

- 07 문자열 세기
str_count(string = , # 원본문자열
pattern = "") # 찾을패턴(정규식 가능, 생략시 문자열의 길이 리턴턴)
str_count('abcd') # 문자열의 길이
length('abcd') # 원소의 개수

str_count('abcdaaa', 'a') # 4(a의 개수)
str_count('a!c.d-a_a', '[[:punct:]]') # 4(특수기호의 수)

- 08 문자열 패턴 확인
str_detect(string = , # 원본문자열
pattern = ) # 찾을 패턴(정규식 가능)
# 예) 이름이 S로 시작하는
emp[str_detect(emp$ENAME, '^S'), ]

# 예) 이름이 T 또는 R로 끝나는
emp[str_detect(emp$ENAME, 'T|R$'),] # T를 포함하거나 R로 끝나는
emp[str_detect(emp$ENAME, '(T|R)$'),] # T 또는 R로 끝나는

- 09 문자열 삽입
str_pad(string = , # 원본문자열
width = , # 총길이
side = c('left','right', 'both'), # 방향
pad = " ") # 삽입문자열(생략 시 공백삽입)
str_pad('abcd', 10, 'left') # " abcd"
str_pad('abcd', 10, 'left', '*') # "******abcd"

str_pad('#', 10, 'left', '#') # 문자열 반복

예) data2.csv 파일을 불러온 뒤 시간대를 시작 시간만 남도록 변경,
승하차컬럼값을 숫자로 변경하시오.
data2 <- read.csv('data2.csv', fileEncoding = 'cp949')
# 승하차 숫자타입 변경)
data2$승차 <- as.numeric(str_remove_all(data2$승차, ','))
data2$하차 <- as.numeric(str_remove_all(data2$하차, ','))
# 시간정보를 4자리로 변경, 왼쪽에 0 삽입)
data2$시간 <- str_pad(data2$시간, 4, 'left', '0')
data2$시간 <- as.numeric(str_sub(data2$시간, 1, 2))

# 노선번호별 시간대에 따른 승차의 변화추이 선그래프로 시각화
install.packages('ggplot2')
library(ggplot2)
ggplot(data2, aes(x = 시간, y = 승차, color = 노선번호, group = 노선번호)) +
geom_line(linewidth = 1) +
geom_point() +
labs(title = "시간대별 노선별 승차 추이",
x = "시간",
y = "승차 인원") +
theme_minimal()

- 10 연속적인 공백 제거
str_trim(string = , # 원본문자열
side = c('left','right','both')) # 제거방향
str_trim(' abc ', 'both') # "abc"

- 11 문자열 반복
str_dup(string = , # 원본문자열
times = ) # 반복횟수
str_dup('#', 5) # "#####"

# [ 참고 - rep, stringr::str_dup 차이 ]
- rep : 벡터 반복
- str_dup : 문자열 반복
rep(x,
times
each)
rep(c(1,2,3), times = 5) # 1 2 3 1 2 3 1 2 3 ...
rep(c(1,2,3), each = 5) # 1 1 1 1 1 2 2 2 2 ...

- 12 문자열 위치
str_locate(string = , # 원본문자열
pattern = ) # 찾을문자열(정규식 전달 가능)
str_locate('abc@efg', '@') # matrix로 리턴, 한글자의 경우 시작위치와 끝위치가 같음
str_locate('abc@efg', 'efg')[, 'start'] # 시작위치 선택
str_locate(pro$EMAIL, '@')

- 13 문자열 길이
str_length(string)
str_length(emp$ENAME)

예) professor.csv 파일을 읽고 모든 교수의 이름과 이메일아이디 출력
# @ 위치 확인)
vno <- str_locate(pro$EMAIL, '@')[, 'start']
# 이메일아이디 추출)
pro$EMAIL_ID <- str_sub(pro$EMAIL, 1, vno-1)
pro[,c('NAME','EMAIL_ID')]

04. 숫자함수
- 01 round
round(x, digit = 0)
round(12345.678)
round(12345.678,2)
round(12345.678, -2)

- 02 trunc
trunc(12345.678) # 자리수 전달 불가

-03 floor
floor(12345.678) # 버림

- 04 ceiling
ceiling(12345.678) # 올림

- 05 abs
abs(-2)

- 06 sign
sign(100)
sign(-100)

- 07 거듭제곱
2^4
2**4

05. 집계함수
- 01 sum
sum(... , na.rm = F)
sum(1,2,3,4,5)
sum(emp$COMM) # NA가 포함된 집계함수 결과는 NA 리턴됨

sum(emp$COMM, na.rm=T) # NA를 무시하고 연산

- 02 mean
mean(1,2,3,4,5) # mean은 연산대상이 하나만 전달되어야하기 때문에, 벡터로 묶어 전달해야함
mean(c(1,2,3,4,5))

- 03 min
min(... , na.rm = F)
min(1,2,3,4,5)

- 04 max
max (... , na.rm = F)
max(1,2,3,4,5)

- 05 median
median(x, na.rm = )
# 중앙값 : 정 가운데 있는 값
median(c(1,2,3,4,5)) # 숫자가 홀수개인 경우 중앙의 숫자 출력
median(c(1,2,3,4,5,6)) # 숫자가 짝수개인 경우 중앙의 평균 출력

- 06 분산
var(x, y=null, na.rm = F)
var(c(1,2,3,4,5))
# 편차 제곱의 합 / n - 1
((1-3)^2 + (2-3)^2 + (3-3)^2 + (4-3)^2 + (5-3)^2) / 4

- 07 표준편차
# 분산에 루트를 씌우면 표준편차
sd(c(1,2,3,4,5))
sqrt(2.5)

'아이티윌_데이터 분석 55기 > 강의내용 필기_통계 및 분석' 카테고리의 다른 글
| #6 6일차 : 외부파일 입출력, DB Connection, 기타 기능 (0) | 2026.04.07 |
|---|---|
| #5 5일차_적용함수, 자료구조 (0) | 2026.04.03 |
| #4 4일차_집합연산자, 조건문, 반복문, 사용자 정의 함수, 적용함수 (0) | 2026.04.02 |
| #3 3일차_그룹핑, 조인, 정렬 (0) | 2026.04.01 |
| #1 1일차_R, Rstudio설치, 기본 기능 (0) | 2026.03.30 |