Big Bro's Studying Archive

R 프로그래밍 입문 (2) 벡터의 생성, 색인, 수정, Boolean 색인, 형확인함수, 논리 연산자 본문

Big Data展

R 프로그래밍 입문 (2) 벡터의 생성, 색인, 수정, Boolean 색인, 형확인함수, 논리 연산자

빅브로오 2020. 4. 17. 14:59

Author : Yoon Baek

참고 : 날짜 포맷 확인

help("strftime")

help 함수 : 해당 함수의 정보를 보여주는 함수
함수의 인자, 인자 타입, 출력 결과등에 대한 설명이 적혀있다.
R을 공부할 때 참조하면 여러모로 좋다.

strftime() #string format time
strptime() #string 파씽 time (파씽 = 해석)

스트링포맷타임 : 날짜 포맷 변경 ( = as.character)
: 날짜의 포맷을 스트링 타입으로 정해준다고 생각하면 편하다.
스트링파씽타임 : 문자를 날짜로 파싱, as.date

strptime('02/10/2020')
#기본값이 없는 인수 "format"가 누락되어 있습니다
strptime('02/10/2020', '%d/%m/%Y')
#[1] "2020-10-02 KST"
strftime(Sys.Date(),'%A')
#[1] "수요일"

year(Sys.Date())
#안됨

패키지를 세션마다 로드해야 하기 때문에
패키지 내부함수는 library()함수로 따로 패키지를 부른 뒤 써야 한다.

R의 자료 구조

  1. 스칼라
  2. 벡터 vector (1차원)
  3. 행렬 matrix
  4. 배열 array
  5. 데이터프레임(data.frame)

벡터

  • 아주 정확한 1차원 데이터
  • 단 하나의 데이터 타입만 허용
  • 오라클의 컬럼과 유사한 느낌

1. 벡터의 생성

v1 <- c(1, 2, 3) ; v1
v2 <- c('a', 1)  ; v2 #(1이 문자로 변환)
v3 <- 1:10 ; v3

v2의 1을 '1'로 형을 통일해 버리는 것이 R 벡터의 특징이다.

2. 벡터의 확장 (값 추가)

v1 <- c(v1, 4) ; v1 #맨 끝 추가
v1 <- append( x = v1, values = 4, after = 2) ; v1
# 중간 추가.

append를 활용하면 추가 값의 위치를 지정할 수 있다.

3. 벡터의 산술연산

v4 <- c(10,20,30)
v5 <- c(10,20,30,40)
v1 + 1    #벡터와 스칼라 연산 가능
v1 + v4   #서로 크기가 같은 벡터 연산 가능
v1 + v5   #서로 크기가 다른 벡터는 작은 벡터가 반복연산
  v5 10 20 30 40
+ v1  1  2  3  1
------------------
     11 22 33 41

크기가 다른 벡터의 반복 연산 논리 구조

4. 벡터의 색인(indexing, 추출)

정수색인

[] : 색인을 나타내는 문법

v5[3]       #벡터 중 3번째 값
v1[c(1, 3)] # 첫번쨰, 세번째 원소 추출, c로 묶어줘야 한다
v1[-1]      # -n : n번째 데이터 제외
            # 파이썬 문법과는 다른 부분 python에서는 뒤에서 1번째
v1[1, 3]    #: 2차원으로 해석

이름색인

names(v1)    # 벡터의 각 원소 이름 출력
names(v1) <- c('a', 'b', 'c')
v1['a']
v1[-'a'] #이름 색인에는 - 사용 불가
v1[c('a', 'b')]
# a b  
# 1 2

위에서 주석을 통해 확인할 수 있다시피
이름을 집어넣을 수도 있으며
이름의 벡터색인도 가능한 점이
R에서는 여러모로 편리한 점이다.

참고 : 2차원 데이터에서의 색인

df1 <- read.csv('emp.csv')

smith와 알렌의 입사일, 연봉

df1[c(1,2), c(5,6)]

smith와 allen의 이름과 연봉추출

df1 [c(1,2), c(2,6)]
df1 [c(1,2), c('ENAME','SAL')] ##둘다 표현 가능
#c(행정보1, 행정보2), (열정보1, 열정보 2)

데이터 프레임은 키의 이름이 있는 형식이기 때문에
키의 이름이 있는 컬럼방향으로는
ENAME, SAL과 같은 컬럼명 전달도 가능하다.

조건색인(boolean 색인)

T, F        # 논리값
TRUE, FALSE # 풀네임으로도 표기 가능
v1[c(T,F,F)]
v1 < 2    # 조건에 맞는 값이 아니라 논리값이 출력
v1[v1<2]  # 조건에 매칭되는 값을 출력
          # Oracle의 where 문법과 같은 역할

예제) emp에서 sal이 2000 이상인 직원 이름, sal 추출

df1[df1$SAL >= 2000, c(2, 6)]

조건을 만족하는 행을 선택하는 것이므로
조건을 행 자리에 넣어준다.

슬라이스 색인(연속추출)

v2 <- 1:10
v2[4:8]
v1['b':'c'] #문자 슬라이스 색인 안됨

[연습문제]

1) emp.csv 파일을 읽고 10번 부서원의 이름, job, sal 출력

df1[df1$DEPTNO == 10, c('JOB', 'SAL')]

행방향에 10번 부서라는 제한 정보 전달 후
원하는 컬럼인 job과 sal 출력

2) 20번 부서원의 sal의 총합 입력

sum(df1[df1$DEPTNO <30 & df1$DEPTNO > 10, 'SAL'])

3) 이름이 scott과 king인 사람의 이름, 사번, 연봉, sal 출력

df1[df1$ENAME == 'SCOTT' | df1$ENAME == 'KING', c('ENAME', 'EMPNO', 'HIREDATE', 'SAL')]  # sol1
df1[df1$ENAME %in% c('SCOTT', 'KING'), c('ENAME', 'EMPNO', 'HIREDATE', 'SAL')]  # sol2

R에서의 or 연산자인 |를 활용하여 or 조건을 주거나
벡터 색인 조건을 줘서 풀 수 있다.

벡터 수정

v1[2] <- 20; 
v2[2:5] <- seq(20,50,10) ;

번호를 부여하여 스칼라를 넣거나
시퀀스 수에 맞는 형식의 데이터에 넣어주면
그 자리에 데이터가 순서대로 들어간다.

예제 v1 벡터에 마지막에 4 삽입, 원소이름을 d부여

v1 <- c(1,2,3) ;v1
v1[4] <- 4
names(v1)[4] <- 'd'
names(v1) <- c('a', 'b', 'c')

벡터 크기 확인

length(v1) #4, 1차원인 벡터의 크기 확인
NROW(v1)   #행의 개수, 1차원일 경우는 원소의 개수 출력
nrow(v1)   #행의 개수, 2차원에서만 정상 작동

NROW는 1,2차원 모두, nrow는 2차원에서도 쓸 수 있다.
다만 1차원에서는 length, 2차원에서는 nrow가 있으므로
의외로 잘 사용하지는 않게 된다.

논리연산자

1) and 연산자

T & T 
T & F
F & F

2) or 연산자

T | T
T | F
F | F

3) not 연산자

!(v1>1)
v1 != 1
!(v1 == 1)

예제) c2에서 3이하, 8이상인 값 출력

v2 <- 1:10
v2[v2 >=8 | v2 <= 3]

포함 연산자

(v1 == 1) | (v1 == 2) # 1이나 2를 포함하고 있느냐
v1 %in% c(1,2)        # or 연산의 축약형
1 %in% v1

형 확인 함수

is.character('a')
class('a')
v10 <- ''
is.na(1)
is.null(v10)
is.character(v10) # true
v3 <- c(1,NA,3,4)
is.na(v3)

F, T, T, T가 출력된다.

예제) 다음의 v3에서 NA인 원소만 찾아 2로 수정

v3
v3[is.na(v3)] <- 2

색인을 통해서 쉽게 수정할 수도 있다.

Comments