빅분기

[R] 빅분기 작업형 1형 연습 문제 (칼럼명 구하기)

멋쟁이천재사자 2022. 11. 15. 10:59

문제


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