barcode

R 배워보기-1. Basics

Coding/R

이거 미디움에도 올려야하나 좀 고민인게 일단 쿡북 분량이 생각보다 좀 되고 미디움에는 코드블럭이 없음... 

네? 설치요? 구글가서 R 설치하는법 찾아보세요. R studio도 같이 깔아야됨. 


Python과의 차이점

1) Python과 달리 R은 인덱스 번호가 1부터 시작이다 
2) 음수 인덱싱이 Python과 달리 빼고 출력하라는 의미이다(파이썬은 맨 뒤에꺼 달라는 얘기)
3) Python pandas는 기본적으로 결측값을 빼고 계산하지만 R은 결측값을 넣은 상태에서 계산한다. 물론 둘 다 반대로 설정하는 옵션이 존재.
4) R은 결측값을 서브셋 이용해서 대체할 수는 있지만 dropna()같은 기능은 없는 듯 하다. 

 

Data Indexing

v = c(1,2,4,8,16,32)

일단 벡터는 이런 식이다. 

v[c(1,2,3)]
[1] 1 2 4

어? 뭐야 0부터 아냐? (파이썬은 0부터)

v[c(5,4,3)]
[1] 16  8  4

거꾸로도 된다. 

> data <- read.table(header=T, text='
+  subject sex size
+        1   M    7
+        2   F    6
+        3   F    9
+        4   M   11
+  ')

이놈이 데이터프레임, 즉 표다. (이쪽이 원조라던가...)

data[1,2]
[1] M
Levels: F M

파이썬처럼 행렬로 인덱싱하는 것도 된다. (그냥 파이썬 판다스에서 되는건 다 된다고 보면 된다)

data[1,2]
[1] M
Levels: F M

컬럼픽이나

data[,1:2]
  subject sex
1       1   M
2       2   F
3       3   F
4       4   M

행, 열에 대해 범위 인덱싱도 된다. 

data[1:4,2]
[1] M F F M
Levels: F M

물론 컬럼'만' 뽑는것도 된다. 

data[1:2,c("subject","size")]
  subject size
1       1    7
2       2    6

판다스도 되겠지... 특정 컬럼 픽을 벡터로 지정해서 그걸로 볼 수 있다. 

 

Boolean Indexing

판다스였나 넘파이였나 아무튼 되는거 봤음. 

v = c(1,2,4,8,16,32,64,128)

준비물: 벡터 (화살표 그거 아님)

v>10
[1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE

10보다 큰 것은 뭐가 있는지 보여준다. 

v[v>10]
[1]  16  32  64 128

마스킹이 번거롭다고요? 이런것도 됩니다. 

v[c(F,T,T,T,F,F,T,T)]
[1]   2   4   8  64 128

이건 True만 뽑아주는건가... 

which(data$sex=="M")
[1] 1 4

아, 당연한 얘기지만 데이터프레임에서도 통한다. 

which(data$sex=="M")
[1] 1 4
which(v>10)
[1] 5 6 7 8

Which()로도 쓸 수는 있는 모양... 

 

Negative Indexing

위에도 썼지만 파이썬에서 -1이면 맨 뒤에꺼고 R에서 -1이면 1번 빼고 달라는 얘기다. 헷갈리지 말자. 

참고로 데이터프레임에서도 먹힌다. 

v=[1,2,4,8,16,32,64,128] # 위랑 같은건데 리스트다
v[-1]
128

파이썬에서는 이런 식으로 맨 끝에 있는 걸 출력하고 

v[-1]
[1]   2   4   8  16  32  64 128

R에서는 첫 번째 원소를 빼고 출력한다.

v[-1:-3]
[]
v[-3:-1]
[32, 64]

파이썬에서 음수 슬라이싱하면 뒤에 있는 놈들을 출력하지만 

v[-1:-3]
[1]   8  16  32  64 128

R은 빼고 출력한다. 

v[3:]
[8, 16, 32, 64, 128]

똑같이 출력하고 싶으면 이렇게 하자. 

length(v)
[1] 8
# 일반적인 길이는 이걸로 출력한다
v[-length(v)]
[1]  1  2  4  8 16 32 64
# 아저씨 잠깐만요 하나 어디갔어요

length는 밑에서 또 다룰 예정이니 패스. 근데 저거 왜 하나 빼는거임? 

 

서브셋 내놔! 드리겠습니다! 필요없어! 

v
[1]  1  3  5  7  9 11 13 15 17

시범조교 앞으로. 

서브셋을 만든다는 건 일종의 그 뭐라하나... 부분집합을 만든다는 얘기다. 

subset(v,v<5)
[1] 1 3

5보다 작은 걸로 부분집합(서브셋)을 만든 상태. 

t
[1] "레어"       "미디움"     "웰던"       "미디움웰던" "미디움레어"
subset(t,t=="웰던")
[1] "웰던"

문자도 된다. 

v[v>=3]=9
v
[1] 1 9 9 9 9 9 9 9 9

뭐야 이거 왜 바껴요 

subset(data,subject>=3)
  subject sex size
3       3   F    9
4       4   M   11
subset(data,select=c(subject,size))
  subject size
1       1    7
2       2    6
3       3    9
4       4   11

전에 했던거랑 비슷한 코드지만 이놈들은 서브셋을 행/열단위로 만든 것. 그럼 저거 둘이 조합도 되나요? 

subset(data,subject>=3,select=c(size))
  size
3    9
4   11

네. 됩니다. 

subset(data,subject %in% c(2,4))
  subject sex size
2       2   F    6
4       4   M   11

벡터가 들어가있어도 된다. 

subset(data,subject>=1 & sex=="M")
  subject sex size
1       1   M    7
4       4   M   11
subset(data,size>10 | sex=="F")
  subject sex size
2       2   F    6
3       3   F    9
4       4   M   11

AND와 OR도 된다. (NOT은 기호를 모름)

subset(data,log2(size)>3)
  subject sex size
3       3   F    9
4       4   M   11
subset(data,size^2>=100)
  subject sex size
4       4   M   11

연산 결과를 통해 필터링하는 것도 된다. 위는 size에 로그 2를 씌웠을 때 3이 넘는 것(원래 데리터가 88보다 큰 것), 아래는 size에 제곱했을 때 100보다 큰 것. 

벡터도 매크로가 되나요

v=rep(1,50)
v
 [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[39] 1 1 1 1 1 1 1 1 1 1 1 1

rep() 쓰면 다 된다. 저렇게 1만 겁나 채우거나 

v=rep(1:5,4)
v
 [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

반복하거나(...)

f=rep(factor(LETTERS[1:5]),5)
f
 [1] A B C D E A B C D E A B C D E A B C D E A B C D E
Levels: A B C D E

와 이게 되네. 

 

변수 정보 뜯어내기

ls(): 지금까지 만들었던 변수 리스트 출력

ls()
[1] "df"  "let" "n"   "x"

 

exists(): 야 이 변수 있냐? (있으면 True)

exists("x")
[1] TRUE

rm(): 변수 삭제(싹 지울때는 rm(list = ls())로 쓴다)

str(): 변수의 형태를 볼 수 있다. ...뭐야 이거 그러면 문자로 어케바꿈? 

str(n)
 int [1:4] 1 2 3 4
str(df)
'data.frame':	4 obs. of  2 variables:
 $ n  : int  1 2 3 4
 $ let: Factor w/ 4 levels "A","B","C","D": 1 2 3 4

위: 벡터/아래: Dataframe

length(): 길이를 표시해준다(python의 len()같은 거)

length(let)
[1] 4

 

nrow(), ncol(), ndom(): 데이터프레임 전용. 각각 행렬 갯수와 차원을 출력해준다. 데이터프레임에 length() 주면 똑띠 안 떠서 저걸로 써야 한다고. 

nrow(df)
[1] 4
ncol(df)
[1] 2
dim(df)
[1] 4 2

 

Null, NA, NaN

일단 셋 다 결측값이긴 한데... Null은 그냥 값이 없는 것이다. 있었는데 없었습니다 아니고 그냥 없다. NA와 NaN은 결측값으로 들어가 있는 상태. 

> is.null(x)
[1] TRUE
> is.null(y)
[1] FALSE
> is.null(z)
[1] FALSE
> is.na(x)
logical(0)
> is.na(y)
[1] TRUE
> is.na(z)
[1] TRUE
> is.nan(x)
logical(0)
> is.nan(y)
[1] FALSE
> is.nan(z)
[1] TRUE

근데 이건 무슨 저세상 결과냐고... NA와 NAN은 NA냐고 하면 트루뜨는데 NA가 NAN이냐고 하면 폴스떠... (x가 널 y가 NA z가 NAN)

v
[1]   1   2   3  NA NaN

벡터가 이렇게 되어 있으면 R은 결측값도 껴서 계산한다. 파이썬 판다스와 반대. (판다스는 저 상황에서 결측값을 빼고 계산한다. 물론 반대 기능을 할 수 있는 옵션도 있다)

> mean(v,na.rm=TRUE)
[1] 2

그래서 이렇게 해 줘야 결측값을 빼고 계산한다. 

v[!is.na(v)]
[1] 1 2 3

위에 썼던 필터링하는 방식으로 결측값이 아닌 걸 볼 수 있지만, dropna()처럼 지워주는 건 없는 듯. !가 NOT이여? 

v[is.na(v)]=0
v
[1] 1 2 3 0 0 6 7 8

일단 서브셋을 활용하면 바꿀 수는 있다. 

'Coding > R' 카테고리의 다른 글

R 배워보기-5. 데이터 불러오고 쓰기  (0) 2022.08.20
번외편-R로 미적분 하기  (0) 2022.08.20
R 배워보기-4. 공식  (0) 2022.08.20
R 배워보기-3. 문자열  (0) 2022.08.20
R 배워보기-2. Numbers  (0) 2022.08.20