R의 데이터에는 벡터와 팩터가 있다. 그리고 숫자벡터-문자벡터-팩터간에 변환이 가능하다. 어쨌든 가능함.
팩터란 무엇인가
뮤츠씨가 좋아하는거 그건 팩트고 아무튼 벡터와 달리 팩터를 단식으로 뽑게 되면 한 가지 요소가 더 나오게 된다. 그것이 바로 '레벨'이다.
> v=factor(c("A","B","C","D","E","F"))
> v
[1] A B C D E F
Levels: A B C D E F
> w=factor(c("35S Promoter","pHellsgate","pStargate","pWatergate","pHellsgate"))
> w
[1] 35S Promoter pHellsgate pStargate pWatergate pHellsgate
Levels: 35S Promoter pHellsgate pStargate pWatergate
팩터는 안에 들어있는 요소들로 레벨을 결정한다. 이 때 중복되는 원소는 레벨링에서 빠진다. 선생님 질문있는데 헬게이트 앞에 왜 p가 있나요 그거 벡터임 예? 벡터라고 왜죠 그건 모르는디?
참고: https://www.addgene.org/vector-database/5976/
진짜로 있는 벡터임
https://www.csiro.au/en/work-with-us/services/sample-procurement/rnai-material-transfer-agreement
스타게이트랑 워터게이트는 벡터 DB에는 없고 관련된 논문(이거 썼다 이런 논문)이 나오는데 셋 다 RNAi 관련된 transformation 벡터임다.
그니까 내 포켓몬 파티가 난천을 다 깨고 나니 레벨이 60, 61, 59, 60, 62, 60이면 이걸 팩터로 만들었을 때 레벨은 59, 60, 61, 62가 된다. 저기 62짜리는 뭐죠 한카리아스 잡았나요 킹갓키스가 원탑플레이 했나보지
레벨 바꾸기
팩터 레벨이 파이썬 튜플마냥 불변이 아니다. 그래서 바꿀 수 있는데... 여기서도 plyr 라이브러리가 쓰인다.
> library(plyr)
> revalue(v,c("A"="A+"))
[1] A+ B C D E F
Levels: A+ B C D E F
> mapvalues(w,from=c("35S Promoter"),to=c("pH2GW7"))
[1] pH2GW7 pHellsgate pStargate pWatergate pHellsgate
Levels: pH2GW7 pHellsgate pStargate pWatergate
plyr 라이브러리를 쓰게 되면 revalue()와 mapvalues()를 쓰면 된다.
> levels(v)[levels(v)=="B"]="B+"
> v
[1] A B+ C D E F
Levels: A B+ C D E F
> levels(v)[1]="A+"
> v
[1] A+ B+ C D E F
Levels: A+ B+ C D E F
> levels(v)=c("A+","B+","C+","D+","E","F")
> v
[1] A+ B+ C+ D+ E F
Levels: A+ B+ C+ D+ E F
라이브러리 없이도 이런 방식으로 바꿀 수 있다. 팩터 레벨은 벡터를 써서 뭉텅이로 바꾸는 게 된다.
sub()과 gsub()
사실 둘이 뭔 차인지 나도 모름... 그래서 해봤음.
> v=factor(c("alpha","beta","gamma","alpha","beta"))
> levels(v)=sub("^alpha$","psi",levels(v))
> v
[1] psi beta gamma psi beta
Levels: psi beta gamma
> levels(v)=sub("m","M",levels(v))
> v
[1] pI beta gaMma pI beta
Levels: pI beta gaMma
sub()은 전체 원소를 치환해주는 건 같지만, 특정 원소의 특정 글자를 치환할 때 첫 글자만 바꿔준다.
> levels(v)=gsub("psi","pi",levels(v))
> v
[1] pi beta gamma pi beta
Levels: pi beta gamma
> levels(v)=gsub("m","M",levels(v))
> v
[1] alpha beta gaMMa alpha beta
Levels: alpha beta gaMMa
gsub()은 sub()과 달리 특정 원소의 모든 특정 글자를 바꿔준다.
레벨 조정-없는 레벨 지우기
> v=factor(c("grass","water","grass"),levels=c("grass","water","fire"))
> v
[1] grass water grass
Levels: grass water fire
여기 팩터가 있다. 근데 요소들을 보다 보니... 레벨은 있는데 요소가 없는 게 있네?
> v=factor(v)
> v
[1] grass water grass
Levels: grass water
그래서 지워드렸습니다.
> x=factor(c("A","B","A"),levels=c("A","B","C"))
> y=c(1,2,3)
> z=factor(c("R","G","G"),levels=c("R","G","B"))
> df=data.frame(x,y,z)
> df
x y z
1 A 1 R
2 B 2 G
3 A 3 G
팩터도 당연히 데이터프레임이 된다. 데이터프레임으로 만들 경우, 데이터프레임으로 출력할 때는 그냥 표로 나오게 되지만
> df$x
[1] A B A
Levels: A B C
여기서 팩터 단식으로 불러내면 이렇게 레벨이 나온다.
그런데 여기서도 요소가 없는 레벨이 있다?
> df=droplevels(df)
> df
x y z
1 A 1 R
2 B 2 G
3 A 3 G
> df$x
[1] A B A
Levels: A B
dropevels()를 쓰면 지워진다.
레벨 조정-순서 조정
> v=factor(c("S","M","L","XL","M","L"))
> v
[1] S M L XL M L
Levels: L M S XL
퍼 펌킨인쨔응 하악하악 뭐여 아무튼... 호바귀와 펌킨인쨔응은 사이즈라는 개념이 있다. 근데 레벨을 보면... 저 순서가 아니다. 알파벳순 아니라고...OTL
> v=factor(v,levels=c("S","M","L","XL"))
> v
[1] S M L XL M L
Levels: S M L XL
그래서 바꿔드렸습니다^^
이거 말고도 방법은 많다.
> w=factor(c("pokeball","superball","ultraball","masterball","pokeball"))
> w
[1] pokeball superball ultraball masterball pokeball
Levels: masterball pokeball superball ultraball
> w=ordered(c("pokeball","superball","ultraball","masterball"))
> w
[1] pokeball superball ultraball masterball
Levels: masterball < pokeball < superball < ultraball
ordered()를 써서 정렬하던가... 근데 이걸 이렇게 정렬하면 안되는데...?
> w=factor(c("pokeball","superball","ultraball","pokeball","masterball"),levels=c("pokeball","superball","ultraball","masterball"))
> w
[1] pokeball superball ultraball pokeball masterball
Levels: pokeball superball ultraball masterball
만들 때 순서를 아예 정하던가...
> w=factor(c("pokeball","superball","ultraball","masterball","pokeball"))
> w=relevel(w,"masterball")
> w
[1] pokeball superball ultraball masterball pokeball
Levels: masterball pokeball superball ultraball
> w=relevel(w,"pokeball")
> w
[1] pokeball superball ultraball masterball pokeball
Levels: pokeball masterball superball ultraball
순서가 다 좋은데 앞에 딱 하나만 걸려 그러면 relevel()로 그 걸리는 걸 앞으로 빼버리면 된다.
> x=factor(w,levels=rev(levels(w)))
> x
[1] pokeball superball ultraball pokeball masterball
Levels: masterball ultraball superball pokeball
아예 거꾸로 하고 싶을 때는 rev()를 쓰면 된다.
'Coding > R' 카테고리의 다른 글
R 배워보기- 6.4. Manipulating data-Restructing data (0) | 2022.08.20 |
---|---|
R 배워보기- 6.3. Manipulating data-Data Frames (0) | 2022.08.20 |
R 배워보기- 6.1. Manipulating data-General (0) | 2022.08.20 |
R 배워보기-5. 데이터 불러오고 쓰기 (0) | 2022.08.20 |
번외편-R로 미적분 하기 (0) | 2022.08.20 |