R프로그래밍 기초

반응형
SMALL

1. R 소개

1. R의 탄생

  • R은 오픈 소스 프로그램으로 통계/데이터마이닝과 그래프를 위한 언어이다.
  • 다양한 최신 통계 분석과 마이닝 기능을 제공한다.
  • 세계적으로 많은 사용자들이 다양한 예제를 공유한다.
  • 다양한 기능을 지원하는 많은 패키지가 수시로 업데이트 된다.
  SAS SPSS R PYTHON
프로그램 비용 유료, 고가 유료, 고가 오픈소스 오픈소스
설치용량 대용량 대용량 모듈화로 간단 모듈화로 간단
다양한 모듈 지원 및 비용 별도구매 별도구매 오픈소스 오픈소스
최근 알고리즘 및 기술 반영 느림 다소 느림 빠름 매우 빠름
학습자료 입수의 편의성 유료 도서 위주 유료 도서 위주 공개 논문 및 자료 많음 공개 논문 및 자료 매우 많음
질의를 위한 공개 커뮤니티 - - 활발 매우 활발
💡R의 특징
  1. 오픈소스 프로그램이다.
  2. 다양한 함수와 패키지를 제공한다.
  3. 매번 데이터를 로딩할 필요가 없으며, 명령어 히스토리도 저장 가능하다.모든 운영체제에서 사용가능하다.

2. R Studio

  • 오픈소스이며 다양한 운영체계를 지원한다.
  • R Studio는 메모리에 변수가 어떻게 되어 있는지와 타입이 무엇인지를 볼 수 있고, 스크립트 관리와 도큐먼테이션이 편리하다.
  • 코딩을 해야 하는 부담이 있으나, 스크립트용 프로그래밍으로 어렵지 않게 자동화가 가능하다.

R 사용법

1. 설치하기

💡R의 작업환경

작업 환경은 업무 규모와 본인에게 익숙한 환경이 무엇인지를 기준으로 선택한다.

기업 환경에서는 64BIT 환경의 듀얼 코어, 32GB RAM, 2TB 디스크, 리눅스 운영체제를 추천한다.

  • R 프로그램 설치하기
  • R STUDIO 설치하기
    • R STUDIO는 https://posit.co/에서 아래와 같은 절차로 다운로드 가능하다.

2. 인터페이스

  • R 인터페이스
    • R의 기본 화면에는 콘솔창(R CONSOLE)이 제공된다.
    • 콘솔(CONSOLE): R CODE와 실행 결과가 제공되며, 콘솔에 명령어를 직접 입력하는 것이 가능하나 권장하지는 않는다.
    • [파일]→ [새 스크립트] 메뉴를 통해 스크립트 창 생성이 가능하다.
    • 스크립트창(R 편집기)은 R 명령어를 생성하고 저장하는 공간이다.
    • → 아마 추가 옵션을 선택하지 않고 R을 설치했다면 바탕화면에 R 아이콘이 뜰 것이다. 그게 아니라면 메뉴에서 직접 검색해서 실행시켜 보면 인터페이스가 열릴 것이다.
  • R STUDIO 인터페이스
    • R STUDIO는 통계 분석과 데이터 처리르 위한 프로그래밍 언어인 R으 사용하는데 최적화된 통합 개발 환경(IDE)이다. 사용자 친화적인 인터페이스, 코드 자동완성, 문서화 기능 등 R 사용자를 위한 유용한 도구이다.

3. R 다루기

  • 패키지 사용하기
    • 함수, 데이터, 컴파일된 코드의 모음을 패키지(PACKAGE)라고 하며, R은 다양한 분석 기능과 알고리즘을 지원하는 방대한 패키지를 제공하고 있다. 패키지 설치와 로드의 과정을 거친 후 사용이 가능하다.
    • 패키지는 R 콘솔창에서 함수를 통해 불러올 수 있지만, 웹에서 직접 설치하는 것도 가능하다. 
      기능 함수 R CODE예시
      패키지 설치 install.packages(”패키지명”) install.packages(”dplyr”)
      패키지 로드 library(패키지명) library(dplyr)
      패키지 업데이트 update.packages(”패키지명”) update.packages(”dplyr”)
      설치된 패키지 목록 확인 installed.pacakges() as.data.frame(installed.packages()[,c(3:4)])
  • 스크립트 다루기
기능 단축키/ R CODE
R CODE 실행 • 한 줄 실행: CTRL+R 혹은 CTRL+ENTER 혹은 F5
• 여러 줄 실행: 드래그 후, CTRL + R 혹은 F5, SOURCE클릭  
스크립트 저장 스크립트에 커서를 둔 상태에서 메뉴를 통해 저장 혹은 CTRL+S
주석달기 스크립트 한 줄 제일 앞 클릭 후 #, 스크립트 영역 지정 후 CTRL+SHIFT+C
도움말 ?함수명, HELP(함수명), RSiteSerch(”함수명”)
- 편리한 기능  
기능 R CODE
현재 작업 중인 폴더의 경로(주소) 산출 getwd()
작업 폴더를 새로 지정 setwd(”사용자 지정 작업 디렉토리”)
현재 작업 중인 폴더에 있는 파일 목록 산출 dir()
파일 이름 확인하기 list.files()
변수 목록 보기 ls()
메모리의 모든 객체 삭제 rm(list=ls())
R 종료 q()
명령어의 끝을 암시 ;
출력 print()
R 스크립트 실행 source(”스크립트 파일명”)
콘솔에 출력되는 텍스트를 텍스트 파일로 저장 sink(”저장될 파일명”)
R에서 생성된 그래프를 PDF 파일로 저장 pdf(”저장될 파일명”)
그래프 생성을 마친 후, pdf 장치 닫기 dev.off()

4. R 기초 중에 기초

  • 변수 생성
    • R에서는 변수명을 선언하고 값을 할당하면 데이터 타입을 스스로 인식하고 선언한다.
    • 변수에 값을 할당할때는 대입 연산자(←, <←, =, →, →>)를 사용하지만, <← 연산자는 전역 변수에 값을 할당할 때 사용하므로, ← 연산자의 사용을 가장 권장한다.
    • EX) name←”Jane”; #name 변수에 Jane이라는 문자 할당
    • EX) number ← c(1,2,3); #number 변수에 숫자 1,2,3을 할당
    • 💡R에서 변수는 데이터를 저장하는 이름을 가진 공간, 변수에 저장된 값은 변수 이름을 통해 참조할 수 있으며, 변수가 정의된 위치에 따라 전역(global)변수와 지역(local)변수가 있다. 전역 변수는 전체 스크립트에서 접근할 수 있지만, 지역 변수는 특정 함수 내에서 만 유효하다.
  • 변수명 규칙
    • R에서 변수 이름을 지정할 때는 아래와 같은 규칙을 지켜야한다.
      • 변수명에는 알파멧, 숫자, _(언더스코어), .(마침표)를 사용할 수 있다.
      • 첫 글자는 마침표 혹은 알파벳으로 시작이 가능하며, 마침표로 시작할 경우 마침표 뒤에는 숫자가 올 수 없다.
      • -(하이픈)은 변수명에 사용할 수 없다.
      • 올바른 변수명 EX) x,y,abc_1,efg.2
      • 잘못된 변수명 EX) 1a, .3, x-y
  • R의 기초 연산자
연산자 우선 순위 표현 방법 및 설명
^ 지수 5^2
+,- 단항 플러스와 마이너스 부호 +3,-5
: 수열 생성 1:30
%any% 특수 연산자  • %/%: 나눗셈의 몫
• %%: 나눗셈의 나머지
• %*%: 행렬곱
*,/ 곱하기, 나누기  2*5,10/2
+,- 더하기, 빼기 5+2,+-3
== 좌우의 값이 같은지 비교하여 TRUE/ FALSE로 변환 3==5
!=, <> 좌우의 값이 다른지 비교하여 TRUE/ FALSE로 변환 3!=5, 3<>5
>=,<= 크거나 같다, 작거나 같다를 비교하여 TRUE/FALSE로 변환 3<=5
! 논리 부정 !(3==4)
&,&& 논리 AND • &: 논리 연산 데이터가 하나 이상인 경우에 사용
• &&: 논리 연산 데이터가 하나인 경우에 사용
|,|| 논리 OR • |: 논리 연산 데이터가 하나 이상인 경우에 사용
• ||: 논리 연산 데이터가 하나인 경우에 사용
~ 식(formula) 종속 변수1+종속 변수2… ~ 독립 변수1 +독립 변수2..
→, →> 왼쪽 값을 오른쪽으로 대입 3→a, 3→> a
=,←,<← 오른쪽 값을 왼쪽으로 대입 a=3,a←3,a<←3

 

  • R을 활용한 기초 통계란 계산
기능 R코드 비고
평균 mean(변수) 변수의 평균 산출
합계 sum(변수) 변수의 합계 산출
중앙값 median(변수) 변수의 중앙값 산출
로그 log(변수) 변수의 로그값 산출
표준편차 sd(변수) 변수의 표준 편차 산출
분산 var(변수) 변수의 분산 산출
공분산 cov(변수1, 변수2) 변수 간 공분산 산출
상관계수 cor(변수1, 변수2) 변수 간 상관계수 산출
변수의 길이의 합 length(변수) 변수의 길이를 값으로 출력

 


2절. 입력과 출력

1. 데이터 불러오기

  • R에서 csv, xlsx, txt 등과 같은 다양한 파일 형식의 데이터를 불러올 때 아래의 함수들을 사용한다.
기능 함수
csv 데이터 파일 읽기 read.csv(”파일명”, header=FALSE, sep=” 구분자” , .stringsAsFactors=TRUE, …)
xlsx 데이터 파일 읽기 read.xlsx(”파일명”, sheetindex=시트번호, startRow=시작행,header=FALSE, …) *xlsx package 설치 필요
txt 데이터 파일을 테이블 형태로 읽기 read.txt(”파일명”, header=FALSE, sep=” 구분자” , .stringsAsFactors=TRUE, …)
txt 파일을 한줄씩 읽기 readLines(”파일명”,…)

 

💡데이터를 불러오는 함수들의 공통 인자
  • header: 첫 행을 변수명으로 지정할지에 대한 여부
  • sep: 데이터 셋을 불러올 때 사용할 열 구분자
  • stringsAsFactors: 문자형 데이터를 팩터로 인식하여 데이터를 불러올지에 대한 여부
  • row.names: 행번호를 지정하여 함께 저장할지에 대한 여부 지정

2. 데이터 저장하기

  • 분석을 완료한 데이터를 파일 형식으로 저장하기 위해서는 아래의 함수들을 사용한다.
기능 함수
csv 데이터 파일 저장 write.csv(저장할 데이터, file=”파일경로/파일명.csv”, row.names=TRUE,…)
xlsx 데이터 파일 저장 write.xlsx(저장할 데이터, file=”파일경로/파일명.xlsx”, sheetName=”시트명”, row.names=TRUE,…)
txt 데이터 파일 저장 write.table(저장할 데이터, file=”파일경로/파일명.txt”, sep=”구분자”, row.names=TRUE,…)
💡R에서 다룰수 있는 파일 타입

R에서는 Tab-delimited text, Comma-seperated text, Excel file, JSON file, HTML/XML file, Database, (Other) Statistical SW’s file 등을 다룰 수 있음

3절. 데이터 타입과 구조

1. R의 데이터 타입

1. 숫자형(numeric)

  • 정수, 실수, 복소수 등의 숫자 데이터는 숫자형 데이터에 해당하며, 수학적 연산 및 통계적 계산이 가능하다.
  • 아래의 R 코드와 같이 새로운 변수에 대입 연산자(←)를 이용해 숫자 데이터를 저장할 수 있다.

2. 문자형(character)

  • 문자 혹은 단어 등으로 구성된 문자들의 집합은 문자형 데이터에 해당한다.
  • R에서 문자는 “” 또는 ‘’내에 표현되며, 문자형 데이터 간의 사칙연산은 불가능하다.
  • 숫자를 “” 또는 ‘’내에 표현하여 변수에 저장할 경우, 문자형으로 저장된다.

3. 논리형(logical)

  • 논리형 데이터 값은 TRUE와 FALSE이며, TRUE(T와 동일)는 참, FALSE(F와 동일)는 거짓을 의미한다.
  • R에서 TRUE는 1로 인식되고, FALSE는 0으로 인식되어 그 자체로 산술 연산이 가능하며, 수치형 데이터로 변환도 가능하다.

4. 팩터형(factor)

  • 범주형 자료를 표현하기 위한 데이터 타입이며, factor 함수를 이용하여 생성한다.
  • 예를 들어 의류의 사이즈(대,중,소) 등과 같은 세가지 카테고리(범주)를 가지는 변수를 생성한다.
  • 대, 중, 소와 같이 범주형 변수 즉, 팩터가 저장할 수 있는 값의 목록을 레벨(level, 수준)이라고 한다.

→ 함수 사용법: factor(data, levels, labels, ordered)

인자 설명
data 범주형으로 표현하고자 하는 데이터
levels 구분하고자 하는 범주(레벨) 목록을 지정
labels 범주형 표시 값 지정
ordered TRUE이면 순서형, FALSE이면 명목형

5. NA/NULL/NAN/INF

  • NA는 Not Available의 약자로 데이터 값이 없음을 의미하는 결측치에 해당한다.
  • NULL은 변수의 값이 초기화 되지 않았을 때 사용하며, 정의 되지 않은 값을 나타낸다.
  • NAN은 Not Available Number의 약자로 수학적으로 계산이 불가능한 값을 의미한다.
  • INF는 Infinite의 약자로 무한대를 의미한다.
  • NA는 상수, NULL은 객체에 해당한다.

6. 데이터 타입 변경

함수 의미
as.numeric(객체명) 객체를 숫자형으로 변환
as.integer(객체명) 객체를 숫자형(정수)로 변환
as.double(객체명) 객체를 숫자형(실수)로 변환
as.character(객체명) 객체를 문자형으로 변환
as.factor(객체명) 객체를 팩터로 변환

2. R의 데이터 구조

1. 벡터(Vector)

  • 벡터는 R프로그래밍의 기본적인 데이터 단위로 다른 프로그래밍 언어의 1차원 배열과도 같은 개념이다.
  • 하나의 벡터는 같은 데이터타입(즉, 같은 mode)을 가진 원소들만 저장할 수 있다.
  • 예를 들어 문자열만 저장하는 배열 혹은 숫자들만 저장하는 배열이 백터라고 할 수 있다.

→ 벡터의 모든 원소는 같은 데이터 타입을 가지기 때문에 문자형과 숫자형을 혼합하여 입력하더라도 모두 문자형이 된다.

  • 인덱싱
    • 벡터에 저장된 값의 위치를 인덱스로 사용하여 각 원소에 접근할 수 있으며, [](대괄호)를 이용한다.
문법 설명
v[n] v벡터의 n번째 값 반환
v[-n] v벡터의 n번째 값을 제외한 나머지 원소들을 반환
v[start:end] v벡터의 start번호부터 end번호에 해당하는 원소들을 반환
💡불리언 인덱싱(Boolean Indexing)

v[조건문]은 대괄호 안의 조건문을 만족하는 벡터의 원소만을 반환한다.

  • 연산
    • 벡터는 저장된 각각의 값에 대한 연산, 벡터 전체에 대한 연산, 벡터끼리의 연산을 모두 수행할 수 있다.
    • 벡터끼리 연산을 수행하면 원소끼리 연산이 수행된다.
    • <길이가 다른 벡터의 연산>
    • 길이가 같지 않더라도 아래와 같은 형태로 계산이 된다.
    • <길이가 같은 벡터의 연산>
💡recycling rule

길이가 다를 경우 자동으로 재활용해 반복하는 것을 말한다. 예를 들면 x가 (2,4,6,8)이고 y가 (1,3)일때 y의 원소를 재활용해 (1,3,1,3)과 같은 형태로 반복하여 계산한다.

2. 행렬(Matrix)

  • 행렬은 2차원의 벡터로 행(로우)과 열(컬럼)의 수가 지정된 구조의 데이터 타입이다.
  • 벡터와 마찬가지로 하나의 행렬은 한 가지 유형의 스칼라 데이터만 저장할 수 있다.

→ 함수 사용법: matrix(data, nrow, ncol, byrow, dimnames)

인자 설명
data 행렬에 저장할 데이터(벡터) 지정
nrow 행의 수 지정
ncol 열의 수 지정
byrow 행렬의 데이터 입력 순서(TRUE: 행 우선, FALSE: 열 우선)
dimnames 행렬의 각 차원에 부여할 이름 지정

 

1. 주요 기능

기능 함수 R CODE 예시
행렬 차원 확인 및 부여 dim(x)  
행력 차원 확인 및 부여 dim(x) ← dim(x) ← c(3,2) #x행렬에 3*2 차원 부여
행의 수 확인 nrow(x)  
열의 수 확인 ncol(x)  
행렬의 원소 추출 x[nrow, ncol] x[3,3] #x행렬의 3행 3열의 원소 추출
행 이름 출력 및 부여 rownames(x)  
행 이름 출력 및 부여 rownames(x)← rownames(x)←c(”r1”,”r2”,”r3”)
열 이름 출력 및 부여 colnames(x)  
열 이름 출력 및 부여 colnames(x)← colnames(x)←c(”a”,”b”,”c”)

2. 주요 연산 행렬끼리 사칙 연산도 가능하며, R에서는 아래의 표와 같은 연산자 및 함수를 통해 행렬만이 할 수 있는 다양한 연산도 가능하다.

기능 연산자 및 함수 설명
행렬의 연산 +,- f+f, f-f, f+1,f-1 행렬 간의 덧셈, 뺄셈, 행렬 상수 간 덧셈, 뺄셈
행렬의 연산 * f%*%f, f*3 행렬 간의 곱, 행렬과 상수 간의 곱
전치행렬 f(x) x의 전치행렬 반환
대각행렬 diag(x) 행렬 x의 대각원소 반환
역행렬 solve(x) x의 역행렬 반환
💡%%와 *의 차이점

*는 각 행렬의 원소끼리의 곱을 나타낸다.

%*%는 행렬의 곱 연산을 나타낸다.

3. 데이터프레임(DataFrame)

  • 데이터프레임은 벡터들의 모임이며, 데이터프레임에 속한 벡터들은 서로 다른 데이터 타입을 가질 수 있다.
이름 전공 성별 나이
이유리 경영학과 20
최민준 컴퓨터공학과 22
김민지 데이터과학과 21
  • 위 표와 같은 데이터프레임은 이름이 저장된 벡터, 전공이 저장된 벡터, 성별이 저장된 벡터, 나이가 저장된 벡터의 모임이라고 볼 수 있다.
  • 벡터는 데이터프레임의 열을 이루며, 열은 변수, 행은 객체에 해당한다.
💡데이터프레임

행렬은 모든 원소가 동일한 데이터 타입을 가져야 하는데 반해 데이터프레임의 각 변수들은 서로 다른 데이터 타입을 가질 수 있다는 장점으로 데이터 분석을 위해 R에서 가장 많이 사용되는 데이터 구조이다.

→ 함수 사용법:data.frame(변수명1=벡터1, 변수명2=벡터2, … 변수명n=벡터n, stringsAsFactors=TRUE)

인자 설명
변수명=벡터 변수명과 해당 열에 저장할 벡터를 지정
stringsAsFactors • 주어진 문자열을 팩터로 저장할지의 여부
• 기본값은 FALSE이므로, 인자값을 지정하지 않으면 문자열은 문자형으로 저장됨
• stringAsFactors의 인자값을 TRUE로 지정하면 문자열을 팩터형으로 저장함
💡유용한 함수
  • na.omit(데이터프레임): NA가 있는 행을 삭제
  • tail(데이터프레임명, n=반환할 행의 개수): 데이터프레임의 하위 행을 반환
  • view(데이터프레임, title=제목): 데이터 뷰어를 호출
  • example(함수명): 특정 함수의 사용 예제를 바로 실행
  1. 주요 기능
기능 함수 R CODE 예시
원소 추출: []이용 data.frame[nrow, ncol]
#nrow: 행번호
#ncol: 열번호
x[3,6] #x의 3행 6열의 원소 출력
x[-3,] #x의 3행을 제외한 데이터 출력
x[,6] #x의 6열의 모든 행 출력
원소 추출: $이용 data.frame$변수명 iris$Species #iris데이터의 Species열 출력
데이터 조회: []이용 data.frame[조건] x[x$var1>4$x$var2==5] #x데이터프레임에서 var1이 4보다 크고, var2가 5인 조건을 만족하는 레코드 출
데이터 조회: subset() 이용 subset(데이터명, 조건) subset(x, var1>4 & var2==5) #x데이터프레임에서 var1이 4보다 크고, var2가 5인 조건을 만족하는 레코드 추출
데이터 조회: subset() 이용 subset(데이터명, 조건, select = 열이름) subset(x,var1>4,select=c(var2,var3))
#x데이터프레임에서 var1이 4보다 큰 레코드의 var2,var3 데이터셋 조회
#유의사항: 변수명에 “”를 표시하지 않음 #select 인자 사용시 변수명 앞에 -를 붙이면 해당 변수는 제외하고 출력됨
데이터프레임의 구조 확인 str(데이터프레임) #데이터프레임의 행 개수, 열 개수, 변수 이름, 변수의 데이터 타입 등을 확인 가능
데이터프레임의 상위 행을 반환 head(데이터프레임 명,n=반환할 행의 갯수) head(x, n=10) #x데이터의 상위 10개의 행 반환 #n인자의 기본값은 6
> ### ====================================
> ### 1. 예시 데이터 만들기
> ### ====================================
> df<- data.frame(
+   이름=c("철수","영희","민수","지영","수빈"),
+   나이=c(23,25,21,24,22),
+   키=c(175,160,180,158,165),
+   점수=c(85,90,78,92,88)
+ )
> 
> df# 데이터 전체 보기
  이름 나이  키 점수
1 철수   23 175   85
2 영희   25 160   90
3 민수   21 180   78
4 지영   24 158   92
5 수빈   22 165   88
> 
> 
> ### ====================================
> ### 2. 원소 추출
> ### ====================================
> # 1) 2행 3열의 값 보기
> df[2,3]
[1] 160
> # 2) 2행 제외하고 보기
> df[-2,]
  이름 나이  키 점수
1 철수   23 175   85
3 민수   21 180   78
4 지영   24 158   92
5 수빈   22 165   88
> # 3) 3번째 열(‘키’) 전체 보기
> df[,3]
[1] 175 160 180 158 165
> ### ====================================
> ### 3. $기호로 열 추출
> ### ====================================
> df$이름
[1] "철수" "영희" "민수" "지영" "수빈"
> df$이름     # 이름 열만 보기
[1] "철수" "영희" "민수" "지영" "수빈"
> df$점수     # 점수 열만 보기
[1] 85 90 78 92 88
> 
> ### ====================================
> ### 4. 조건으로 행 조회
> ### ====================================
> # 나이가 23보다 큰 사람 보기
> df[df$나이>23,]
  이름 나이  키 점수
2 영희   25 160   90
4 지영   24 158   92
> 
> # 점수가 85점 이상인 사람 보기
> df[df$점수 >= 85, ]
  이름 나이  키 점수
1 철수   23 175   85
2 영희   25 160   90
4 지영   24 158   92
5 수빈   22 165   88
> 
> 
> ### ====================================
> ### 5. subset() 함수 사용
> ### ====================================
> # 조건으로 행 조회 (나이 > 23)
> subset(df,나이>23)
  이름 나이  키 점수
2 영희   25 160   90
4 지영   24 158   92
> 
> 
> # 조건 + 특정 열만 보기 (나이 > 23이고, 이름과 점수만 보기)
> subset(df, 나이 > 23, select = c(이름, 점수))
  이름 점수
2 영희   90
4 지영   92
> 
> ### ====================================
> ### 6. 데이터 구조 확인
> ### ====================================
> str(df)    # 데이터의 형태, 변수 종류, 데이터 타입 등 확인
'data.frame':    5 obs. of  4 variables:
 $ 이름: chr  "철수" "영희" "민수" "지영" ...
 $ 나이: num  23 25 21 24 22
 $ 키  : num  175 160 180 158 165
 $ 점수: num  85 90 78 92 88
> 
> ### ====================================
> ### 7. 상위 몇 개 행 보기
> ### ====================================
> head(df, n = 3)   # 위에서 3행만 보기
  이름 나이  키 점수
1 철수   23 175   85
2 영희   25 160   90
3 민수   21 180   78

4. 기타

  • 스칼라(Scalar)
    • 스칼라는 ‘가’,’나’,’다’와 같은 단일 값을 의미하며, 하나의 숫자, 문자, 논리형 데이터가 저장될 수 있다.
  • 배열(Array)
    • 행렬이 2차원이라면, 배열은 3차원 또는 n차원까지 확장된 형태의 다차원 데이터이다.
  • 리스트(List)
    • 리스트는 벡터, 데이터프레임, 배열, 함수 등과 같은 R의 모든 객체를 담을 수 있는 최상위 데이터 구조이다.
    • (키, 값) 형태로 데이터를 저장하는 연관 배열(Associative Arrays)로 각 객체에 이름을 지정하여 저장할 수 있으며, 저장할 객체들의 종류가 달라도 무방하다.

5. 데이터 구조 변경

  • 자료형과 데이터 구조는 아래와 같은 함수들을 통해 변경할 수 있다.
    • as.data.frame()
    • as.list()
    • as.matrix()
    • as.vector()

3. 데이터 핸들링

1. 데이터 결합

기능 함수 R CODE 예시
행 결합 rbind(객체1, 객체2, …) rbind(df1,df2) #df1과 df2를 행으로 결합
열 결합 cbind(객체1, 객체2, …) cbind(df1, df2) #df1과 df2를 열로 결합
데이터 병합 merge(df1, df2, by=”df1과 df2의 공통 열 이름(병합할 기준이 되는 열)”) merge(x,y,by=z) #x와 y를 z라는 공통변수를 기준으로 병합
💡rbind, cbind

rbind와 cbind는 두 객체를 강제로 붙인다. 따라서 rbind는 열의 개수와 열의 이름이 동일해야 하고, cbind 또한 행의 개수가 동일해야 강제로 붙일 수 있다.

> ### ====================================
> ### 1. 예시 데이터 만들기
> ### ====================================
> df1 <- data.frame(
+   이름 = c("철수", "영희", "민수"),
+   점수 = c(85, 90, 78)
+ )
> 
> df2 <- data.frame(
+   이름 = c("지영", "수빈"),
+   점수 = c(92, 88)
+ )
> 
> df3 <- data.frame(
+   이름 = c("철수", "영희", "민수", "지영", "수빈"),
+   키 = c(175, 160, 180, 158, 165)
+ )
> 
> df1
  이름 점수
1 철수   85
2 영희   90
3 민수   78
> df2
  이름 점수
1 지영   92
2 수빈   88
> df3
  이름  키
1 철수 175
2 영희 160
3 민수 180
4 지영 158
5 수빈 165
> 
> 
> ### ====================================
> ### 2. 행 결합 (rbind)
> ### ====================================
> # df1과 df2를 행으로 결합 (같은 열 이름이어야 함)
> all_rows <- rbind(df1, df2)
> all_rows
  이름 점수
1 철수   85
2 영희   90
3 민수   78
4 지영   92
5 수빈   88
> 
> 
> ### ====================================
> ### 3. 열 결합 (cbind)
> ### ====================================
> # 열 개수가 같을 때 가능 (예: df1과 df3는 행 개수가 다르므로 결합 불가)
> # 예시로, 같은 행 개수를 가진 데이터로 결합해보기
> info1 <- data.frame(이름 = c("철수", "영희", "민수"))
> info2 <- data.frame(키 = c(175, 160, 180))
> info3 <- data.frame(점수 = c(85, 90, 78))
> 
> # 열로 결합
> cbind(info1, info2, info3)
  이름  키 점수
1 철수 175   85
2 영희 160   90
3 민수 180   78
> 
> 
> ### ====================================
> ### 4. 데이터 병합 (merge)
> ### ====================================
> # 두 데이터프레임을 공통된 열을 기준으로 병합
> # 이름 열을 기준으로 병합
> merged <- merge(df1, df3, by = "이름")
> merged
  이름 점수  키
1 민수   78 180
2 영희   90 160
3 철수   85 175
> 
> # 만약 공통 열 이름이 다르다면 by.x, by.y 사용
> a <- data.frame(학생 = c("철수", "영희", "민수"), 점수 = c(85, 90, 78))
> b <- data.frame(이름 = c("철수", "영희", "민수"), 키 = c(175, 160, 180))
> 
> merge(a, b, by.x = "학생", by.y = "이름")
  학생 점수  키
1 민수   78 180
2 영희   90 160
3 철수   85 175

2. 제어문(반복문, 조건문, 사용자 정의)

  1. 반복문
    • for
      • 특정 구문을 반복적으로 수행할 경우 for, while, repeat문을 활용하여 해결할 수 있다.
      • 그 중에서도 for문은 주로 반복 횟수가 정해진 경우에 사용하며, 문법과 활용 예시는 아래와 같다.
        문법 설명
        for(변수 in 데이터){ 반복할 코드 } • ‘데이터’는 여러 값이 지정된 벡터이며, ‘데이터’에 들어있는 값을 변수에 모두 할당할 때까지{}안의 코드를 반복해서 수행
        • 데이터 자리에는 수치형 벡터 혹은 수치형 벡터를 저장한 변수를 지정
        • for문 안에 또 다른 for문을 중첩하여 사용 가능
    • while
      • while문은 반복 횟수의 지정 없이 주어진 조건이 참이라면 계속해서 반복을 수행하는 제어문이다.
        문법 설명
        변수 ← 초기값 while(조건){ 조건이 참일 때 수행할 코드 } • 괄호 안에 조건이 참일때 {}안의 코드가 수행되고, 조건이 거짓일 때 while문이 종료
        • while문을 정의하기 전에 먼저 조건에 사용될 변수의 초기값을 지정해야 함 

2. 조건문

  • if/else
    • 조건식을 기준으로 조건이 참(TRUE)일 때와 거짓(FALSE)일 때의 처리 방식을 다르게 하려는 경우에는 if/else 조건문을 사용한다. 
      문법 설명
      if(조건1){
      조건1이 참일 때 수행할 코드
      }else if(조건2){
      조건1이 거짓이고 조건2가 참일 때 수행할 코드
      } else{ 모든 조건이 거짓일 때 수행할 코드}
      • 괄호 안의 조건이 참, 거짓일 때 각각 {} 안의 코드를 실행
      • 조건이 하나 이상인 경우, else if를 통해 조건을 추가할 수 있으며, 여러번 추가하는 것도 가능
      • else if와 else는 필요에 따라 지정하거나 생략이 가능
  • ifelse
    • 처리하고자 할 구문이 단순할 경우에는 if/else 대신 ifelse 함수를 사용할 수 있다.
      문법 설명
      ifelse(조건,a,b) • 조건이 참이면 a자리의 코드를 실행하고, 거짓이면 b자리의 코드를 실행
      • 내부에 또 다른 ifelse 구문을 중첩하여 사용 가능
      • 엑셀의 if()함수처럼 1줄 만으로도 조건문 코드를 작성할 수 있다는 강력한 장점이 있다.
  • 사용자 정의
    • 사용자가 원하는 기능을 가진 함수를 직접 만들기 위해서는 다음과 같은 R코드를 사용한다.
    • function(인자1,인자2,인자3,...인자n){ 표현식1 표현식2 ...표현식n return(반환값) }
    • 함수의 작동에 필요한 인자들을 첫 번째 괄호 안에 명시한 후, 중괄호({})안에 함수에서 수행할 구문을 입력한다.
    • return 구문에는 함수의 실행이 완료된 후 최종적으로 반환할 값을 입력한다. 반환할 값이 없는 경우에는 return 구문을 생략할 수 있으며, return값을 명시하지 않으면 {}안의 마지막 구문이 만들어 내는 결과를 반환한다.
    • 인자의 갯수가 정해지지 않은 경우와 함수 내부에서 호출하는 다른 함수로 인자를 넘겨줄 경우에는 인자목록에 ‘…’라는 표현을 사용한다.
    • 함수 내부에 또 다른 함수를 정의하는 ‘중첩함수’의 정의가 가능하다.

> ### ====================================
> ### 🧮 학생 점수 계산기 함수
> ### ====================================
> 
> score_calculator <- function(mid, final, hw) {
+   # 1. 평균 점수 계산
+   avg <- (mid + final + hw) / 3
+   
+   # 2. 등급 계산
+   grade <- ""
+   if (avg >= 90) {
+     grade <- "A"
+   } else if (avg >= 80) {
+     grade <- "B"
+   } else if (avg >= 70) {
+     grade <- "C"
+   } else if (avg >= 60) {
+     grade <- "D"
+   } else {
+     grade <- "F"
+   }
+   
+   # 3. 결과 반환 (리스트 형태)
+   result <- list(
+     평균 = round(avg, 2),
+     등급 = grade
+   )
+   
+   return(result)
+ }
> 
> ### ====================================
> ### 🧍‍♂️ 함수 사용 예시
> ### ====================================
> 
> # 철수의 점수: 중간 85, 기말 90, 과제 80
> score_calculator(85, 90, 80)
$평균
[1] 85

$등급
[1] "B"

> 
> # 영희의 점수: 중간 70, 기말 75, 과제 65
> score_calculator(70, 75, 65)
$평균
[1] 70

$등급
[1] "C"

> 
> # 민수의 점수: 중간 95, 기말 98, 과제 100
> score_calculator(95, 98, 100)
$평균
[1] 97.67

$등급
[1] "A"

3. 문자열/날짜형 데이터 핸들링

  1. 문자열 다루기
함수 기능
rchar(”문자열”) 문자열의 길이 반환
paste(”문자열1”,”문자열2”,…,sep=””) 지정한 문자(열)를 sep에 지정한 구분자로 연결
substr(”문자열”, 시작번호, 끝번호) 문자열의 시작번호부터 끝번호까지를 추출
strsplit(”문자열”, 구분자) 구분자를 기준으로 문자열을 분리
sub(”대상문자열”, “변경문자열”, str) str(문자열)에서 대상문자열을 찾아 변경 문자열로 한번만 대치
gsub(”대상문자열”,”변경문자열”,str) str(문자열)에 있는 모든 대상문자열을 변경문자열로 대치
grep(”찾을 문자열”,str) str(문자열)에서 찾을 문자열이 포함된 문자열 혹은 인덱스를 출력

### ----------------------------------
### 1. 문자열의 길이 확인
### ----------------------------------
text <- "Hello R!"
nchar(text)    # 문자열 길이 (7)

### ----------------------------------
### 2. 문자열 연결
### ----------------------------------
a <- "Hello"
b <- "World"
paste(a, b, sep = " ")      # "Hello World"
paste(a, b, sep = "-")      # "Hello-World"

### ----------------------------------
### 3. 부분 문자열 추출
### ----------------------------------
sentence <- "Statistics"
substr(sentence, 1, 4)       # "Stat"
substr(sentence, 6, 10)      # "stics"

### ----------------------------------
### 4. 문자열 분리
### ----------------------------------
fruits <- "apple,banana,grape"
strsplit(fruits, ",")        # "apple" "banana" "grape"

### ----------------------------------
### 5. 문자열 치환 (한 번만)
### ----------------------------------
text <- "R is good, R is fast"
sub("R", "Python", text)     # 첫 번째 R만 변경

### ----------------------------------
### 6. 문자열 치환 (모두)
### ----------------------------------
gsub("R", "Python", text)    # 모든 R 변경

### ----------------------------------
### 7. 문자열 찾기 (grep)
### ----------------------------------
names <- c("철수", "영희", "민수", "지영")
grep("영", names)            # "영"이 들어간 인덱스
grep("영", names, value = TRUE)   # "영"이 포함된 값 출력

2. 날짜형 다루기

함수 기능
Sys.Date() 현재 날짜 반환
as.Date() 데이터 타입을 날짜 형식으로 변환
format(Sys.Date(), “%m%d%y”) 현재 날짜를 format에 지정한 형태의 문자열로 변환
format(Sys.Date(),”%a”) 축약된 형태의 요일 조회
format(Sys.Date(),”%b”) 축약된 월 이름 조회
format(Sys.Date(),”%B”) 전체 월 이름 조회
format(Sys.Date(),”%d”) 두 자리 숫자로 일 조회
format(Sys.Date(),”%m”) 두 자리 숫자로 월 조회
format(Sys.Date(),”%y”) 두 자리 숫자로 연도 조회
format(Sys.Date(),”%Y”) 네 자리 숫자로 연도 조회

 

### ----------------------------------
### 1. 오늘 날짜
### ----------------------------------
Sys.Date()

### ----------------------------------
### 2. 문자 → 날짜형 변환
### ----------------------------------
date_str <- "2025-10-16"
as.Date(date_str)     # 날짜형으로 변환

### ----------------------------------
### 3. 날짜 포맷 변경
### ----------------------------------
format(Sys.Date(), "%m%d%y")   # 월일년 (예: 101625)
format(Sys.Date(), "%a")       # 요일 (예: Thu)
format(Sys.Date(), "%b")       # 축약 월명 (예: Oct)
format(Sys.Date(), "%B")       # 전체 월명 (예: October)
format(Sys.Date(), "%d")       # 일 (예: 16)
format(Sys.Date(), "%m")       # 월 (예: 10)
format(Sys.Date(), "%y")       # 연도(2자리, 예: 25)
format(Sys.Date(), "%Y")       # 연도(4자리, 예: 2025)




반응형
LIST

'데이터분석-ADSP > 3과목-데이터분석' 카테고리의 다른 글

데이터 마트  (0) 2025.12.09
데이터 분석 개요  (1) 2025.11.04