이거 미디움에도 올려야하나 좀 고민인게 일단 쿡북 분량이 생각보다 좀 되고 미디움에는 코드블럭이 없음...
네? 설치요? 구글가서 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 |