본문 바로가기
게임 제작 관련/개발환경(프로그램)

R subset, which함수 & 패키지 다루기(엑셀 등)

by 김바보 2022. 10. 11.

원래 시각화 들어가면서 R 시작하기를 끝내려고 했는데, 이러다간 시작만하고 나가리 될 것 같아 좀 바꿔봤다.

다음번엔 진짜 시각화 파트를 할 것이다.

 

1. subset(조건)

R 시작하기1에서 필터링하는 것으로 n[조건]을 배웠다. subset()도 같은 기능을 한다.

subset과 n[조건]의 차이점으론 NA를 무시한다는 것이다.

* NA는 데이터가 존재하지 않을때를 표현

 

x = c(6, 1:3, NA, 12) 일때

x[x>5]
[1]  6 NA 12
-----------------
subset(x, x>5)
[1]  6 12

 

 

 

2. is.na(조건)

NA를 판별하는 함수다. 데이터를 가공할때 NA값을 미리 파악해서 제거하거나 임의값을 넣을때 유용하게 사용한다.

x
[1]  6  1  2  3 NA 12

is.na(x)
[1] FALSE FALSE FALSE FALSE  TRUE FALSE

NA가 있는 자리에만 TRUE로 바뀌어있는 것을 볼 수 있다.

 

subset없이 n[조건]을 이용해 NA를 없애고 싶다면

x
[1]  6  1  2  3 NA 12

x[x>5 & !is.na(x)]
[1]  6 12

-----------------------------
!is.na(x)   #not연산자 = FALSE가 TRUE로 바뀜
[1]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE

not연산자와 AND연산자를 사용해주면 된다.

그럼 이쯤에서 잠시 논리연산자를 알아보자.

 

 

2-1. 논리연산자 + 연산자 되짚어보기

R시작하기에서 일반 연산자를 써놨었다.

 

<산술, 비교 연산자>

x^2 : 거듭제곱

x**2

 

x%/%5 : x를 5로 나눈 몫

x%%5 : x를 5로 나눈 나머지

 

== 같다

!= 다르다

 

<논리연산자>

[R 강의] 10. 논리연산자 (and, or, not) (tistory.com)

 

[R 강의] 10. 논리연산자 (and, or, not)

도구 R로 푸는 통계 10. 논리연산자 (and, or, not) 논리연산자에는 세 가지가 있습니다. and, or, not 입니다. 논리 연산의 결과는 TRUE 와 FALSE 라는 진리값입니다. 1. and 연산자 and연산자는 두 피연산자

statools.tistory.com

직접 쓰려다가... 너무 잘 정리하신 분이 있어서 링크를 가져왔다.

링크를 가져온다고 얘기는 딱히 안했는데, 문제가 있다면 바로 삭제하겠다.

 

 

 

3. which(조건)

which는 조건에 맞는 값을 확인, 위치를 알 수 있는 함수다.

R 시작하기에서 비슷한 동작을 하는 함수를 배웠었다. 바로 match()다.

참고로 match와 함께 설명했던 %in%는 등장하는지만 논리형으로 나타낸다.

x
[1]  6  1  2  3 NA 12

which(x>5)
[1] 1 6

5보다 큰 x값이 1번째, 6번째에 있다는 뜻이다.

match(a,b)의 경우 조건이 아니라, 벡터a가 벡터b에 존재하는지 & 어디에 존재하는지를 나타낸다.

그렇다고 match에 조건이 못 들어가느냐 하면 그건 또 아닌데... 도출된 값이 왜 이렇게 나오는지를 모르겠어서 넘어간다.

 

 

x = c(3,1,4,1)
which(x>3)
----------------
integer(0)


y = which(x>5)
length(y)
-----------------
[1] 0

조건에 부응하지 않을 경우 integer(0)을 반환한다.

integer(0)의 벡터 길이는 0이기 때문에, length를 사용해 조건을 만족시키는 원소가 있는지, 몇개 있는지 알 수 있다.

 

 

4. any(조건)

any는 조건에 대한 TRUE / FALSE를 출력한다.

x = c(3,1,4,1, NA)
any(x>5)
-------------------
[1] NA

x1 = c(3,1,4,1)
any(x>5)
-------------------
[1] FALSE

x2 = c(3,1,6,1, NA)
any(x>5)
-------------------
[1] TRUE

조건에 부합하지 않는 상태에서 NA가 있다면 NA로 출력된다. (왜...?)

반대로 조건에 부합하면 NA가 있든말든 TRUE로 출력된다.

 

 

정리하자면

n %in% x: 벡터n이 벡터x에 존재하는가? -> 논리형 출력

match(n, x): 벡터n이 벡터x에 존재하는지 & 어디에 있는지 -> 순서 출력

which(조건): 조건에 부합하는지 & 어디에 있는지 -> 순서 출력

any(조건): 조건에 부합하는지 -> 논리형 출력

 

아래는 예제에 있길래 해본거

<%in%쓰지 않고 %in% 구현하기>

A = c(3,1,4,1)
B = c(2,1,4)
A %in% B
[1] FALSE  TRUE  TRUE  TRUE
-------------------------------

C = match(A, B)
!is.na(C)
[1] FALSE  TRUE  TRUE  TRUE

 

 

5. 작업공간 저장

절대경로 = (파일이 갖고있는) 고유 경로

상대경로 = 현재 위치해있는 경로, 불러올때 현 경로를 기준으로 이동

./ : 현재 위치

../ : 현재 위치의 상단 폴더

 

getwd():현 위치 경로 파악

setwd(' ') : 파일을 해당 절대경로로 지정

 

 

6. 파일 불러오기

거의 다왔다. 시각화를 위해선 R에 데이터를 불러오는 과정이 필요하다.

A = read.table("C:/Users/계정의 사용자명/Downloads/CO2.txt", header = TRUE, sep = " ",
				stringsAsFactors= F)

파일이 있는 경로를 절대 경로를 사용해 직접 열어줬다.

 

데이터를 불러오기 전에 파일을 열어 데이터가 어떻게 저장되어 있는지 확인하자.

hearder = TRUE: 첫 줄에 열의 이름이 있다면 TRUE로

sep = " ": 데이터가 어떻게 구분되어 있는지

                데이터 간 띄어쓰기로 구분되어 있기에 " "

                만약, 데이터 간 tab으로 구분되어 있다면 \t

stringsAsFactors = F: 데이터 문자열을 팩터(논리형)으로 불러올 거냐?

                                      굳이 논리형으로 부를 필요가 없으니 F

 

이렇게 A에 CO2 라는 파일을 불러온 것이다.

B = read.table("C:/Users/계정의 사용자명/Downloads/CO2.txt")

사실 다른것 안쓰고 이렇게만 써도 불러는 와진다. (무슨 차이가 있는지는 잘 모르겠다)

프로젝트 경로 안에 불러오려는 파일이 있다면 read.table("CO2.txt") 이렇게 이름만 써도 불러와진다.

 

<참고>

txt파일: read.table

엑셀파일: read.xlsx(패키지 다운 필요)

                read.readxl(패키지 다운 필요)

csv파일: read.csv

 

 

6-1. 패키지 다루기

엑셀 파일에 있는 데이터를 불러오기 위해서는 조금 복잡한 과정을 거쳐야 한다.

어째 쓰다보니 포스팅이 점점 길어진다...

 

 

1. 패키지 설치

install.packages('readxl')   #엑셀보는 패키지 다운로드
library(readxl)              #라이브러리 호출

해당 명령어를 이용해 엑셀 패키지를 설치하고, 라이브러리까지 호출해줘야 사용이 가능하다.

그러나 패키지라는 놈이 굉장히 예민한 애라서 맞춰줘야 하는게 많다.(패by패긴 함)

 

오류가 떠가지고 한참 해맸는데, 이걸 보는 당신은 그러질 않길 바란다. readx1(one)이 아니라 readxl(L)이다. 다 알파벳이다!!!

패키지 ‘readxl’를 성공적으로 압축해제하였고 MD5 sums 이 확인되었습니다

다운로드된 바이너리 패키지들은 다음의 위치에 있습니다
	C:\Users\계정의 사용자명\AppData\Local\Temp\RtmpgFd1pk\downloaded_packages

정상적으로 설치됐다면 이렇게 떠야 한다.

 

 

2. 패키지 삭제

remove.packages("readxl")

뭔가 꼬여서 삭제하고 싶다면 쓰자.

우측 하단 Packages창 들어가서 직접 검색, 삭제해도 된다.

 

 

3. 패키지 불러오기

B = read_excel("C:/Users/계정의 사용자명/Downloads/CO2.xlsx")

하고 B를 보면 불러와진다.

패키지에는 여러가지가 있으니 필요할때 찾아보도록 하자.

 

아 그리고 엑셀 패키지 중에 'xlsx'라고 있다. 아마 설치는 되는데 library 호출하면 자바설치하라고 에러가 뜰 것이다.

자바를 깔면 해결은 되는데... 탈모올 것 같으니 readxl을 쓰자. 둘에 무슨 차이가 있는지 잘 모르겠다.

 

6-n. 한글 사용자명 관련하여

만약 자신이 윈도우를 설치할때 이름을 한글로 설정했다면

In addition: Warning message:
In normalizePath(path.expand(path), winslash, mustWork) :
  path[1]="C:/Users/???/Documents": 파일 이름, 디렉터리 이름 또는 볼륨 레이블 구문이 잘못되었습니다

해당 오류가 뜰 것이다. 해봤던 패키지인 readxl, ggplot2의 경우 경고 메시지가 떠도 일단 작동은 됐다.

그러나 경로때문에 안되는 패키지도 있을 것이다.

단순히 제어판에 들어가 사용자명을 영어로 바꾸는 것으론 해결이 안된다.

C:/Users/사용자명 <-폴더 이름은 바뀌지 않기 때문이다.

 

외장하드가 있다면 웬만하면 그곳에서 R을 사용하자.

 

저 폴더를 영어로 바꾸기 위해선 레지스트리를 건들여야 하는데, 잘못하면 계정 전체가 날아간다.

나같은 경우엔 자꾸 오류가 떠서 결국 못바꿨다.

일단... 될때까진 살아보자...

댓글