-
각양각색의 R 질문들과 풀이R 이모저모 2019. 3. 21. 21:32
공부를 하다보면 R관련 커뮤니티서나 같은 일을 하는 분들에게 여러 질문들이 들어오곤 합니다. 오늘 포스팅에서는 이 질문들 중 몇 가지를 풀어보고자 합니다
Q1. 데이터프레임 형식으로 된 어떤 column 의 element 들을 24개씩 묶어서 더한 값으로 이루어진 새로운 column 을 만들고 싶습니다
*사용 패키지 : dplyr
몇개의 row들을 합한 결과를 나타내는 쉬운 방법은 grouping을 할 새로운 변수를 만든 후 group_by와 summarise를 활용하는 것입니다.
dplyr의 mutate 함수를 이용해 row를 24개씩 묶어줄 변수를 만들고, 이 변수를 기준으로 summarise를 했더니 24개 데이터의 합이 나왔습니다. 같은 방법으로 평균, 최빈값 등을 구할 수 있습니다.
Q2. 모든 칼럼의 row 평균치를 날짜별로 불러오고 싶어요
*사용 패키지 : dplyr마찬가지로 날짜 변수를 기준으로 group_by를 사용하면 됩니다. 단, 모든 칼럼의 평균치를 가져오고 싶으므로 summarise가 아닌 summarise_all을 사용합니다.iris 데이터에 date변수를 생성하여 기준을 만든 후 4개의 연속형 변수들의 평균을 구한 결과입니다.
Q3. 데이터프레임을 변수 y의 종류에 따라 필터링하고 칼럼의 평균을 구하고 싶습니다
*사용 패키지 : dplyrgroup_by로도 처리할 수 있을까 싶지만 칼럼의 평균을 구하는 colMeans 함수는 칼럼별로 적용을 해야해서 쉽지 않습니다. 저는 병렬처리 후 list로 반환해주는 lapply와 병렬처리 후 맞춤형으로 값을 반환해주는 sapply를 활용하여 해보았습니다.class1과 2라는 두 가지 데이터를 가진 팩터변수 y를 기준으로 분류 후 colMeans 함수를 이용해 값을 도출하였습니다.
Q4. 그래프 fill이 제가 원하는 white, black으로 되지 않네요. 어떤 부분이 잘못된 것인지 궁금하네요.
*사용 패키지 : ggplot, dplyrggplot2에서 ggplot을 만들 때 자주 겪는 문제입니다. 이는 ggplot의 aes(Aesthetic) 함수안에 색깔명을 집어넣을 경우 글자로 인식하지 않고 팩터로 인식해서 생기는 문제인데요, 아래 코드와 두 그래프를 보면 알 수 있습니다.그림에서 위의 그래프는 id를 기준으로 fill에 기본 배색을 사용하고, 아래 그래프는 의도한 대로 흰색과 검은색을 칠하는데 사용하는 것을 볼 수 있습니다.
Q4. 생성한 모델을 저장하여 다른 로컬로 옮겨 사용할 수 있는 방법이 궁금합니다
*사용 패키지 :Rdata형식으로 환경을 저장하면 간단히 해결할 수 있는 문제입니다.기본설정 기준우측 상단의 패널에서 environment 탭 밑의 열기/저장 표시로 Rdata형식의 파일을 R환경으로 불러올 수 있습니다. 이때, 만약 a라는 데이터만 남기고 나머지를 없애고 싶다면 rm(list = ls()[-grep('a',ls())])를 실행해주면 a라는 객체 이외의 모든 객체를 삭제하게 됩니다.
Q5. R에서 대문자파이(모든값곱)는 명령어가 어떻게될까요
*사용 패키지 :prod함수를 이용하면 요소들의 곱을 구할 수 있습니다.Q6. geom_histogram, geom_density를 동시에 그리려고 합니다 -> density의 값이 너무 낮아서 안그려짐
*사용 패키지 : ggplot, dplyrggplot말고도 일반 plot에서 histogram과 density plot을 동시에 그리려하면 자주 나타나는 문제입니다. 이는 historgram의 y축인 빈도와 density plot의 y축인 density의 값 차이가 크기 때문에 벌어지는 일로, histogram의 y축을 density로 바꿔줌으로서 해결할 수 있습니다.y축이 density로 통일됨으로서 두 그래프가 조화롭게 그려짐을 확인할 수 있습니다.
Q7. 연도별 고객 중복이용현황을 알고 싶습니다. -> 데이터 펼치기
*사용 패키지 : tidyr, dplyr
tidyr이라는 패키지에서 주로 다루는 spread, long 형식의 데이터 문제 중 spread와 관련된 문제입니다.요청은 왼쪽의 데이터를 오른쪽과 같은 형식으로 바꾸는 것으로, 오른쪽 데이터는 년도, 회사 이름을 가진 칼럼명으로 구성되어 있고 회사명인 칼럼들은 각각 해당 년도의 고객 수를 값으로 가져야합니다.
이 경우는 tidyr에서 정의하는 spread, 퍼진 데이터에 속합니다. 이유는 왼쪽 데이터가 오른쪽 데이터보다 row 개수는 많고 column 개수는 적기 때문입니다.
해당 문제는 년도와 회사라는 두 변수로 데이터를 묶어 summarise로 정리한 후 spread함수를 이용해서 데이터를 펼쳐주면 해결할 수 있습니다.(NA를 0으로 바꾸고 싶다면 replace_na로 바꿔주면 됩니다)
마치며
이상으로 실무에서 만나볼법한 간단한 문제들 7개를 예제로 풀어보았습니다. 물론, 제가 풀은 방법들이 반드시 정답이라는 보장은 없으며 더 쉽고 빠른 방법이 존재할 수도 있습니다. 그래도 이런 문제들을 나름의 방식대로 풀어보는 것이 자신만의 know-how를 쌓아가는데 큰 도움이 된다고 생각합니다. 이 글을 보신 분들도 각각의 질문에 대해 자기 나름대로 코드를 작성해보면 재밌는 시간이 될 것 같습니다.
[ 컨텐츠 코드 ]
'R 이모저모' 카테고리의 다른 글
R과 병렬처리 (4) 2019.04.03 알고리즘 소개 : XGBoost (0) 2019.03.30 R과 데이터프레임(3) (0) 2019.03.24 R과 데이터프레임(2) : dplyr (0) 2019.03.14 R과 데이터프레임 (1) (0) 2019.03.10