카테고리 보관물: R

data.frame melt 시키기

테이블의 컬럼들을 한 컬럼으로 내리고 값을 따로 빼는 것을 melt(melting)라고 합니다.그 반대로 값을 컬럼으로 올리는  작업을 cast (casting)라고 합니다.
이런 것을 엑셀이나 DB에서는 pivot(pivoting 추축) 이라고도 하고 또 transform이라고도 말합니다.

R과 python에서 melt하는 간단한 코드 스니펫을 올립니다.  Google에 검색을 하면 다 나오는 것이지만 순전히 제 편의를 위해서 올려둡니다.

R은 특히 ggplot2를 사용할 때 facet을 쓰려면 melt된 상태여야 하는 것이 있어서 연습이 필요합니다만 늘 까먹습니다. (전 바보인가봐요)

R코드입니다.
다른 방법도 많지만 R은 reshape2 패키지를 쓰는 것이 편합니다.

# install.packages("reshape2")
library(reshape2)  # 해들리 만세
iris  # 이렇게 생겼어요
iris.molten <- melt(iris, id.vars=c("Species"))  # Species 는 놔두고 모두 멜트
iris.molten  # melt한 data.frame

python코드입니다.
python은 당연히 Pandas에 melt 함수가 있습니다.

from sklearn import datasets  # iris data 때문에 로딩했어요
import pandas as pd  # 팬더스
import numpy as np  # 데이터 변환을 하는데 numpy가 필요할 뿐이었어요
iris = datasets.load_iris()  # 예제를 위해서 iris가 필요할 뿐
print(iris) # 이렇게 생겼는데
iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names) # 일단 iris가 dataframe이 아니어서 바꿈
print(pd.melt(iris_df))  # 이렇게 바뀝니다

 

RStudio 1.1 릴리즈

지난 10월 9일 RStudio 1.1이 릴리즈되었습니다.

설치를 하고 나면 다크테마로 설정된 달라진 분위기의 애플리케이션 모습을 볼 수 있습니다.

RStudio v1.1

공식 내용은 RStudio blog에서 확인할 수 있습니다.

https://blog.rstudio.com/2017/10/09/rstudio-v1.1-released/

업데이트 내용은

  • 다크테마 지원
  • 데이터베이스 컨넥터 지원 및 탐색 기능
  • 오브젝트 탐색 기능 강화
  • 터미널 탭 지원
  • 기타 소소한 업데이트

입니다.

당연한 것이겠지만 Rstudio server 1.1도 몇가지 기능 개선과 더불어 릴리즈 되었습니다.

 

R 3.4.1 릴리즈

2017년 6월 30일자로 R 3.4.1 버전이 릴리즈(release) 되었습니다.

패키지 설치시 문제와 펑션에 유니코드가 포함되어 있을 때 디스플레이에서 발생하는 문제를 비롯한 패키지 개발관련의 버그들이 수정되었다고 합니다.

3.4.1의 코드네임은 “Single Candle”입니다. 3.4.0의 코드네임은 “You stupid darkness” 이더군요. R은 늘 코드네임을 이해가 쉽게 안가는 것을 붙이는데 이번에는 코드네임이 왜 이런가 하고 링크를 봤더니 아래의 “피너츠”(찰리브라운과 스누피?) 만화의 대사이더군요.

전 귀찮아서 아직 업그레이드를 안했습니다만…

 

R – yaml 파일 읽어오기

R로 작성한 script에서 가끔 복잡한 설정들 읽어야 할 때가 있습니다. 여러 방법을 사용할 수 있겠지만 설정파일을 만들어 놓고 읽어서 사용하는 방식을 선호하는데 예전에는 json 포맷을 설정으로 쓰다가 너무 너저분해서 이번에 yaml으로 바꿔봤습니다.

R이 너저분해지는 이유가  이런 종류의 tree 구조의 파일을 읽어서 자료구조로 바꿀때 R에서는 list 타입을 사용해서 맵핑하게 되는데 list의 하위 아이템이 1개인 경우 다른 랭귀지와는 많이 다르게 굉장히 복잡해 집니다. 이렇게 복잡한 이유가 R에는 모든 데이터타입이 기본적으로 vector 취급되기 때문입니다.

그런데 yaml을 사용해보니 json을 사용할 때보다는 데이터타입을 훨씬 잘 변환해 주는 것 같습니다.

패키지는 yaml을 설치해서 사용하면됩니다.
전체 코드는 아래에 있습니다.

# install.packages("yaml")
require(yaml)
configuration = yaml.load_file("d:\\workspace\\test_configuration.yaml")

print(configuration)
is(configuration)  # configuration 심볼의 타입 확인

print(configuration$var_0001)  # 각각 하위 요소들의 내용 확인
print(configuration$var_0001$var_0001_01)  # 각각 하위 요소들의 내용 확인

configuration$var_0001$var_0001_01[[1]]  # 이건 여전히 문제
is(configuration$var_0001$var_0001_01[['var_0001_01_01']])
is(configuration$var_0001$var_0001_01[['var_0001_01_02']])

print(configuration$var_0002)
print(configuration$var_0003)
print(is(configuration$var_0003))

test_configuratino.yml 파일의 내용

var_0001:
  var_0001_01:
    var_0001_01_01: "value_0001_01_01"
    var_0001_01_02: "value_0001_01_02"
var_0002:
  - "value0002_1"
  - "value0002_2"
  - "value0002_3"
  - "value0002_4"
  - "value0002_5"
var_0003: True

주의할 것은 하위 항목이 1개인 것은 여전히 [[1]] index를 지정해주지 않으면 안됩니다. 그래도 JSON보다는 훨씬 쓰기도 편하고 좋은것 같습니다.

R – 변수에 값을 넣고 바로 결과를 출력하기

제목대로 입니다. 정말 별것 아닙니다. 아주 가끔 유용하게 쓸 때가 있습니다.

variable <- 2 * 3
(variable <- 2 * 3)

핵심은 2번째 줄입니다.

직접 실행해 보세요.

예전에 어떤 R 전문가들이 모여서 토론하는 메일링리스트에서 저렇게 쓰는 것을 본 적이 있어서 기억하고 있었습니다.

원리는 간단하면서도 오묘한데 R의 구조를 이해하는데도 도움이 됩니다.

R은 값을 가진 symbol이나 값 자체를 호출하게 되면 기본으로 print함수가 호출되어서 심볼의 내용을 출력하게 되어 있습니다. 그런데 <- 나 = 로 변수대입(실제로는 심볼지정)을 하게 되면 print는 기본으로 작동하지 않습니다.

그래서 연산자 심볼인 소괄호로 묶어주면 최종 연산된 값이 리턴되고 바로 print까지 실행됩니다.

저걸 쓸 일이 있겠나 싶겠지만 정말 가끔 쓸 일이 있어요. ^ㅡ^;;;


위에 제가 이해를 위해서 연산자라고 적었는데 오해의 여지가 있지 않을까하는 걱정에 내용을 추가합니다.

R에는 연산자가 없습니다. (아마도…)
다음 코드를 실행하고 결과를 확인해 보세요.

is(`[`)  # 얘는 펑션
`[`

is(`(`)  # 얘도 평션
`(`

is(`<-`)  # 얘도 평션
is(`=`)  # 얘도 평션

is(`]`)  # 하지만 얘는 펑션이 아님
`]`

is(`)`)  # 얘도 아님
`)`

닫는 괄호들은 무슨 타입인지 잘 모르겠지만 함수도 아니고 일반 심볼도 아닙니다.  아마 표현문 종료 기호같은 R 내부에서는 어떻게 취급되는지 모르겠습니다.

다음 코드도 한 번 실행해 보세요.

e <- parse(text="(1+2)")
e[1][[1]][[1]]
e[1][[1]][[2]]
e[1][[1]][[3]]
e[1][[1]][[4]]

결과는 직접 확인해 보세요.
이걸 이해하셨다면 R의 내부구조를 많이 이해한 것이 됩니다.