아이티윌_데이터 분석 55기/강의내용 필기_통계 및 분석

#2 2일차_벡터, 데이터 프레임, 문자열 함수

ecosso 2026. 3. 31. 16:20

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)