문제
mtcars 에서 최대값이 가장 큰 칼럼명은 무엇인가?
오답
# summary해보면 눈에 바로 보여요. 그런데 그것을 print 또는 cat 으로 찍으면 하드코딩입니다.
summary(mtcars)
max <- sapply(mtcars,max)
print("disp") # No No hard coding
answer <- "disp"
print(answer) # 이것도 똑같은 하드코딩입니다
주저리
4회 빅분기 실기 보려고 준비했던 내용입니다.
이전 기출 문제 중 하드코딩 이슈로 수험생들 사이에 논란이 컸다는 이야기를 유튜브에서 봤던 것 같아요.
그래서 혹시라도 그런 문제가 또 나오면 어떻게 할지 준비했던 내용입니다.
거지같은 문제에 대한 분노를 전처리 능력 훈련으로 승화시켜 보았습니다.
준비답안 1
library(dplyr)
cols <-colnames(mtcars)
dd <- as.data.frame(cbind(cols,max))
dd %>%
mutate( max = as.numeric(max)) %>%
arrange(desc(max)) %>%
as.data.frame() -> dd2
answer <- as.character(dd2[1,1])
cat(answer) # 준비 당시에는 print(answer) 였는데 4회 시험에서 print 대신 cat 쓰라고 해서 수정합니다
준비답안 2
library(dplyr)
dd <- as.data.frame(sapply(mtcars,max))
colnames(dd) <- c("val")
dd %>% arrange(desc(val)) %>% head(1) %>% row.names() -> answer
cat(answer)
trouble shooting
지금도 ADP 실기를 준비하며 R 을 공부하고 있지만, 빅분기 준비 당시에는 쌩쌩쌩초보 시기였습니다.
그래서 준비답안 1을 만들면서 한참을 헤매다 정확히 정리하지 못한 부분이 있었습니다.
dd <- as.data.frame(cbind(cols,max))
dd %>%
#mutate( max = as.numeric(as.character(max))) %>%
arrange(desc(max)) %>%
as.data.frame() -> dd2
처음에 중간 mutate 부분 없이 작성했습니다.
그런데 결과가 이상했습니다.
dd 를 str 로 찍어보니 max 라는 변수가 숫자가 아니라 문자로 바뀌어 있었고, 그래서 수치 기준의 정렬이 아닌 문자 기준으로 arrange 되면서 예상과 다르게 동작했던 것이었습니다.
이런 저런 시행착오를 거쳐서 mutate( max = as.numeric(as.character(max))) %>% 을 추가해서 해결했습니다.
mutate( max = as.numeric(max)) 로 하면 될 것을 이것 저것 마구잡이로 막 해보는 과정에서 as.numeric(as.character(max)) 라는 구문을 시도했던 듯 합니다.
오랜만에 다시 코드를 살펴보고 원인을 연구해보았습니다.
cbind 는 결과를 matrix 로 반환하고, matrix 는 동일한 자료구조만 들어갑니다.
matrix 에 들어가는 자료는 raw < logical < integer < double < complex < character < list 순서대로 결정이 되나 봅니다.
cbind(cols,max) 에서 cols 는 character 이고 max 는 numeric 이므로 둘 다 character 로 통일되어 변형됩니다.
arrange 전에 numeric 으로 변환해주면 원하는 대로 정렬을 할 수 있습니다.
참고자료
https://stackoverflow.com/questions/11151339/r-numeric-vector-becoming-non-numeric-after-cbind-of-dates
https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/cbind
'빅분기' 카테고리의 다른 글
4회 빅분기 실기 합격 후기 (0) | 2023.03.07 |
---|---|
4회 빅분기 필기 합격 후기 (1) | 2023.03.07 |
[R]빅분기 실기 단답형(F1 스코어 구하기) (0) | 2022.07.27 |
빅분기 작업형 1유형 연습 문제[R] (0) | 2022.07.15 |
ADsP 빅분기 ADP필기 원트 연속 합격 (1) | 2022.07.10 |