2014년 5월 27일 화요일

[Using R] Cannot load rJava.dll error

 "KoNLP"는 한글에 관한 텍스트 마이닝(text mining package) 을 사용하기 위해서 라이브러리를 로딩하다 보면 기본적으로 " rJava " 패키지를 로딩하게 된다. 그런데 아래와 같은 상황이 발생 하는 경우 몇가지 체크하고 처리 해 줘야 할 것들이 있다.

* Error Log Display

> library(rJava)
Error : .onLoad failed in 'loadNamespace' for 'rJava'
Error: package/namespace load failed for 'rJava'

Error in inDL(x, as.logical(local), as.logical(now), ...) :
  unable to load shared library
     'C:/Program Files/R/R-3.1.0/library/rJava/libs/x64/rJava.dll':
  LoadLibrary failure:  The specified module could not be found.


** Operation Env.

1) Windows 7 64Bit

2) R version 3.1.0 (2014-04-10)

3) Java 1.7.55
java version "1.7.0_55"
Java(TM) SE Runtime Environment (build 1.7.0_55-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)



** 해결방안

1) 환경변수에 JAVA_HOME 추가
JAVA_HOME=C:\Program Files\Java\jre7\bin

2. 환경변수 PATH에 값을 잘아 줌
Path=%PATH%;C:\Program Files\Java\jre7\bin\server\;C:\Program Files\R\R-3.1.0\bin\x64


* 이것이 아니어도 몇가지 맞춰야 할 정보들이 있다면 JDK 또는 JRE의 Bit 를 맞춰야 한다. R을 64비트 인경우 Java도 64비트로 설치하고 32비트 인경우 32비트로 맞춰야 한다.

2014년 5월 26일 월요일

[Private Story] Start My Story - #2 남달랐던 유년기 시절

#My Story #2 - 남달랐던 유년기 시절

이 글은 스스로를 돌아 보며 생각하는 글이기도 하면서 먼 훗날 나의 사랑하는 두 아들 밝음이와 맑음이가 글을 읽고 지금의 아빠를 그때의 너희가 이해할 수 있길 바라면서 남기는 미리쓰는 편지로 남았으면 한다. 너희 할아버지가 돌아가시고 나서 아빠는 할아버지의 흔적을 책장에 있는 책 몇권에 남겨진 사인이 전부란 사실에 가슴이 너무나 아팠다. 그리고 안타까웠다. 그래도 마지막 서명에 남겨진 할아버지의 뜻을 가슴으로 받았단다.

내 이야기를 다시 이어간다. 나는 유년시절 참 말썽꾸러기 아이였던 것으로 기억이 되고 또 시골 어르신들의 기억속에도 크게 다르지 않다. 시골에서 자란 나는 온동네에 있는 외양간, 그리고 논과 밭이 나의 놀이터 였고 또 내 어린 시절의 추억의 현장이기도 했었지. 하지만 그 때 내 기억속의 아버지는 무섭기만 한 존재였고 어렴풋이 기억나는건 지팡이를 들고 계시던 할아버지의 모습만 흐릿하게 기억에 남아 있다. 운동을 좋아 했고 달리기를 보통보다는 좀더 나아가 400미터 계주로 부락(이게 국어사전의 표준어 인지는 모르겠다) 대표로 나갔었다. 자랑거리 아닌 자랑거리가 되었던 어린시절 난 아마도 운동선수는 되지 못하더라도 레져 스포츠 선생님이나 그쪽 분야에 분명 가 있을 것이라고 처음 미래에 대한 단꿈을 꾸웠었다.

그런데 나에게 첫 시련(? - 지나고 보니 시련이라기 보단 전환점)이 생겼다. 중학교 시절 즈음이었던 것으로 기억이 난다. 매일 매일 저녁마다 피곤함을 이기지 못했다. 당연히 앉아서 가만히 있던 성격이 아닌 대부분의 시간을 운동을 하거나 밖에서 뛰어 논 것이 전부 였던 나 였으니 몸이 피곤한 것이라고 생각을 했지 나의 몸에 이상이 있을 것이라곤 생각도 하지 못했다. 가까운 병원에 가서 피검사 결과 더 큰 병원에 가길 권했다. 어린나이에 뭐가 뭔지도 모르고 시내로 나간다는 즐거움이 더 컸을까? 기억해보면 내 자신의 상태를 정확히 알지 못했던것 같다. 내가 느낀건 부모님 두분의 얼굴이 심각했다는 것 이었다. 그리고 그 이후로 전국에 몸에 좋다는 민간요법의 것을을 무진 찾아서 해주셨다. 이후에 알았는데 그 당시 치료제가 존재하지 않았다고 한다. 대부분 임상실험 중이었고 실제로 상용화 되기엔 시간이 필요 했다.

그 이후 많은 것들이 달라 졌다. 친구들과는 다른 삶을 살아야 했다. 다른 시간이 학교에 가고 다른 시간에 집에 가며 같은 공간에 있지만 다른 생각을 하고 다른 행동을 해야 했다. 내 학창 시절에 가장 힘든 시기 였던것 같다. 왜 나만 그래야 하는지 다르다는걸 인정 할 수 없었다. (물론 성적이 다르다는건 참으로 인정을 빨리도 그리고 진심으로 했다. ). 그 당시엔 생각하지 못했지만 지나고 보니 내가 달라지는 계기(?)가 되었다. 아니 인생에 전환점 이었다고 기억에 남아 있다.

사는것 인생이란 단어에 큰 의미를 부여한 적도 생각해본적도 사실 없었다. 부끄럽단 생각을 하게 되었던 끝을 알 수 없는 병원 생활의 시작에서 난 장르를 불문한 독서를 하게 된 계기가 되었다. 주로 시집을 읽게 되었다. 글씨가 너무나 많은 책들을 처음부터 접하기 참 힘들었고 알수 없는 끓어 오름이라는 그 무언가는 사랑에 목말라 있었다. 누구는 삼류 사랑 타령이란 시집부터 고전에 이르기 까지 아낌없이 읽고 또 읽었다.

( 그 당시 읽다 보니 쓰고 싶어 졌고 쓰다 보니 내 책을 내보고 싶단 생각도 했던것 같다. 아쉽게도 20살 혈기 왕성할 때 모두 불태워 버리거나 친구녀석(?)을 줬는데 아마도 다 버렸을 것으로 생각이 된다. )

중간 중간 학기가 시작이 되면 난 다시 퇴원을 했고 방학이면 입원을 했다. 병원생활 해본 사람은 알겠지만 그렇게 재미난 경험은 아니라는 것. 난 학창시절을 그런 반복속에 살아 갔다. 그 당시 내 병실엔 나보다도 한참이나 나이 많으신 분들이 많으셨다. 심하게 안좋으신 분들도 계셨고 피로가 누적되 그냥 몇일 쉬다가 가시는 분들도 계셨고 부족한 나의 사회성을 그 병실 자그마한 곳에서 새롭게 배워가고 있었다. 자그마한 6평 남짓한 곳엔 세상이 있었다. 각자의 인생을 풀어 내는 보따리가 항상 가득했다. 삶에 대한 후회도 있었고 나이가 지긋했지만 앞으로의 희망도 있었다. 하루종일 난 한마디 없이 그분들의 이야기를 오롯이 듣기만 했다. 문득 그런 생각이 들었다.

내일 당장 내가 여기서 죽는 다면 난 내 짧은 인생(삶)에 대해서 뭐라 말을 해야 할까? 이렇게 그냥 아무 생각 없이 끝내고 싶거나 죽고 싶지 않다는 생각을 하게 되었다. 남아 있는 삶이 얼마인지 모르나 순간 순간에 최선을 다 해야 겠단 생각을 그리고 나만 생각하고 살지 않길 스스로에게 다짐하는 기회가 되었다. 그것이 다분히 착하게 살아야 겠다는 아니었다.

그 당시에 난 많은 것을 배운것 같다. 왜 살아 가는 하루 하루가 소중한지 알았고 정성을 다해 열심히 살지 않으면 안되는지 그리고 내가 처해진 상황에 대한 것을 진실되게 받아 들이지 않는다면 힘들어 지는건 나 하나 뿐 아니라 내 주변에 모든 사랑하는 사람들이 함께 아파 한다는 것을 말이다. 그래서 그 당시의 나는 가장 많이 성장한 시기이자 전환점이었다 생각을 한다. 너희들에게도 분명 나와 같은 시기와 비슷한 경험을 하게 되리라 생각된다. 분명 살면서 힘든 시기는 반드시 온다. 하지만 그때 꼭 기억하길 바란다. 가장 힘든시기에 가장 많은 기회와 본질적인 마음의 성장을 너희에게 가져다 줄 것이다. 피하려고만 하지 말길 바란다. 그것을 받아 들이 돼 진심으로 받아 들이고 마음에 새기고 새로운 네가 아닌 성장한 네가 되길 진심으로 바란다.

책을 읽는 것을 게을리 하지 말거라. 그곳엔 답이 없지만 앞으로 살아가야 할 너희들이 선택한 인생에 대한 답을 만들어 줄 것이다. 그리고 어떤 사람이든 너의 주변에게 너에게 말하든 그렇지 않든 모든 말에 새겨 들어라 그 모든 말들은 너희들의 생각에 좋은 영향과 나쁜 영향을 함께 주면서 어떤 말들이 올바른 선택을 위한 말인지 잘못된 말인지 구분할 수 있는 능력을 만들어 줄 것이다.

오늘 하루도 잠시전 그 시간도 후회없는 삶을 살길 바란다. 또한 나에게 남은 많은 시간들을 나도 그렇게 보내기 위해 오늘도 노력하고 노력하겠노라 약속 하마.







2014년 5월 23일 금요일

[Movie #1] 영화 역린을 보다. - 현빈을 다시 보다



[사진 출처 - 네이버 영화]


아이들 둘 낳고 키우다 보니 극장에서 마음놓고 영화를 보는 일이 흔하지 않은건 우리들 만의 일은 아니다. 아내의 생일이기도 했고 또 왠지 가끔 한번씩 이렇게 나와서 영화를 보는것도 좋겠다. 싶어 오게 되어 선택한 역린이란 영화는 뜨거운 가슴과 여운을 몇일이 지난 지금도 남아 있다.

주변에서 영화에 대한 좋고/나쁨이 확연하게 구분되어져서 사뭇 놀라기도 하고 영화/연기를 전공한 친구 까지 별로라는 대답을 했을 땐 그냥 그저 그런영화 이구나 싶었다. 그런데 끝나고 나서 쉬이 자리를 일어나지 못했다. 미안한 마음과 죄송한 마음 그리고 그것이 한꺼번에 찾아 온것이다. 혹평을 한 전문가나 기자나 평론가들의 기준이 무엇인지 잘 모르겠으나 영화의 주된 내용을 소품이나 중간 중간의 억지스러운 전개가 있다고 하기엔 평가 자체가 좀 억지스러운것 아니었을까?

정조에 대한 암살 사건에 대한 24시간이 숨막히게 돌아가고 있는것에서 과거의 회상 신들이 나타나며 지금의 모습의 설명을 덧붙여 주고 있다. 어떤 이들은 이것이 중심을 잡지 못한 이유로 꼽고 있으나 개인적인 생각으론 공감되지 않는 트집으로 밖에 안보인다. 난 몰입도가 끝날 때 까지 좋았는데... 뭐 개인적인 사람들 간의 차이가 있을수 있으니 뭐라 말하기엔 어렵지 않을까 싶기도 하고 말이다.

어찌 되었든 영화를 보고 나서 밀려오는 지금 이 순간의 대한 민국이 떠오르지 않았다면 아마도 그는 역린이란 영화를 보고 혹평을 쏟아 낼 지 모르겠다. 정조의 마지막 대사로 나오는 중용의 23장에 대한 말이 계속 깊은 가슴을 두두리는 것은 우리가 그렇게 살아 가지 못한 미안함과 또 우리가 그렇게 살아야 할것이라는 메세지를 주는 것은 아니었나 싶다. 이 시나리오를 보고 받아 들인 현빈이 얼굴만 잘생기고 몸매만 좋은 것이 아니라 현빈이란 배우를 새롭게 다시보게 된 영화가 아닐 수 없다.

" 오직 세상에 지극히 정성을 다하는 사람만이 나와 세상을 변하게 할 수 있는 것이다. "

잊지 말자...



- 기억에 남는 부분이자 역린의 시작과 끝인 부분은 바로 중용의 23쪽을 아는가?

其次(기차)는 致曲(치곡)이니 曲能有誠(곡능유성)이니
誠則形(성즉형)하고
形則著(형즉저)하고
著則明(저즉명)하고
明則動(명즉동)하고 動則變(동즉변)하고
變則化(변즉화)하니
唯天下至誠 (유천하지성)이야 爲能化(위능화)니라.


작은 일도 무시하지 않고 최선을 다해야 한다.
작은 일에도 최선을 다하면 정성스럽게 된다.
정성스럽게 되면 겉에 베어 나오게 되고
겉에 베어 나오면 겉으로 들어나고
겉으로 들어나면 이내 밝아지고
남을 감동시키면 이내 변하게 되고
변하면 생육 된다
그러니 오직 세상에 지극히 정성을 다하는 사람만이
나와 세상을 변하게 할 수 있는 것이다.


[Book #23] 여덟 단어 - 박웅현 지음



"책은 도끼다" 라는 책을 읽어 보신 분이라면 박웅현 작가의 책이 주는 몰입감을 잊을 순 없으실 겁니다. 그만의 독특한 관점과 사고가 흥미로웠던 과거의 책들 이었다면 이번에 추천 드리는 여덟 단어는 지극히 평범하지만 삶에 대한 우리들의 자세에 대한 깊은 성찰이 필요 하다는 것을 공감할 수 있을 것이라 생각됩니다.

결국 일, 업 이라는 것에 대한 깊은 본질적 고민이 묻어나는 공감어린 글들이 참으로 많습니다.

책은  저자가 생각(정리)한 여덟개의 단어를 중심으로 우리가 우리 스스로의 삶에 대해서 좀더 진지하고 좀더 인문학적인 사고로 접근을 해보는 그러니깐 인문학이 가지고 있는 공통점인 본질을 찾아 가는 과정과 생각들을 가져야 한다고 잘 풀어내고 있습니다. 어떤것을 모르는 사람에게 알려주는 그런 풀이가 아니라 함께 공감하고 느끼고 이해하는 과정을 스스로 펼쳐 준다는 그런 느낌의 책입니다.



제 1강 - 자존 : 당신 안의 별을 찾으셨나요?
제 2강 - 본질 : Everyting Changes but Nothing Changes
제 3강 - 고전 : Classic, 그 견고한 영혼의 성
제 4강 - 견 : 이 단어의 대단함에 대하여
제 5강 - 현재  : 개처럼 살자
제 6강 - 권위 : 동의되지 않는 권위에 굴복하지 말고 불합리한 권위에 복종하지 말자
제 7강 - 소통  : 마음을 움직이는 말의 힘
제 8강 - 인생  : 급한 물에 떠내려가다 닿은 곳에 싹 틔우는 땅버들 씨앗처럼


위의 8가지 내용 중 모두 추천하고 좋은 공감의 내용이지만 2강 본질에 대한 이야기가 가장 가슴에 남았습니다.  에르메스 브랜드 지면광고에 나오는 문구인 " Everyting Changes but Nothing Changes  " 모든것은 변하지만 아무것도 변하지 않는다. 본질에 대한 이야기는 어쩌면 식상하고 또 꺼내기 어려운 이야기 일 수 있습니다. 그러나 각자 자신의 삶에 대한 본질이든 기업이 가진 본질적 의미이든 우리가 잊지 말아야할 그리고 또 잊어서도 안되는것이 바로 이것 이지 않을까 생각합니다. 세상에 70억의 사람이 있지만 그 모두가 다릅니다. 세상의 아주 많은 기업이 있지만 모두가 같은 기업이 아닙니다. 그들은 각자의 본질을 가지고 있습니다. 또한 그 본질에 다가가기 위한 방법을 방식을 가지고 있습니다. 그들을 따라가기 위한 무조건적인 방식이 아니라 자신의 본질을 먼저 정확히 인지하고 찾아 낸 다음 내 안의 궁극적인 방향과 방식을 찾아내는 인문학적인 사고와 관점이 요구되는 때 입니다. 본질은 현재의 안위를 보장하지 않습니다. 그러나 본질 찾기를 시작한 우리에겐 더 많은 행복과 자신감을 심어 줄 수 있으리라 확신 합니다. 책 읽기에 참 좋은 요즘 시작 해보세요.  



이 책의 맨 뒤편엔 이렇게 쓰여 있다.

"
인생의 정답을 찾지 마시길, 정답을 만들어 가시길
내일을 꿈꾸지 마시길, 충실한 오늘이 곧 내일이니
남을 부러워 마시길, 그 많은 단점에도 불구하고 나는 나.
시류에 휩쓸리지 마시길, 당대는 흐르고 본질은 남는것
멘토를 맹신하지 마시길. 모든 멘토는 참고 사항 일 뿐이니.
이 책의 모든 내용을 단지 하나의 의견으로 받아들이시길.
그리고 당신 마음속의 올바른 재판관과 상의하며
당신만의 인생을 또박또박 걸어가시길
당신이란 유기체에 대한 존중을 절대 잃지 마시길
"

 - 박웅현




내 인생과 삶 또한 나만의 것이나
나 혼자만의 것이 아니라 본질적으로 내가 중심이된 삶이라는 뜻이겠으니
행복이 나만 행복하면 행복한것이 아니고 내 옆사람이 행복하고 가족이 행복하고 공동체가 행복한 그래서 모두가 행복한 것이 그 삶이 좋은 삶이 아닐까. 그러기 위함에 있어 내가 지금 이 순간을 어떻게 헛되이 보낼 수 있겠는가 싶은 생각이 든다.


2014년 5월 19일 월요일

[Using R] Cook Book Tip - Help & Search

#Command to view the contents of the document
help.start()

#View full help by function
help(function name) 또는 ?function name

#View by simple functions for function arguments
args(function name)

#Run this example by using the function
example(function name)

#Example
install.packages("rpart")
library(rpart)
help(rpart)
args(rpart)
example(rpart)

#Search the documentation
help.search("pattern")
??pattern


#Sample
install.packages("tseries")
library(tseries)

help(adf.test)
help.search("adf.test")

help(package="tseries")
vignette()
vignette(package="package name")
vignette("package name")


# If you need to search through the internet
RSiteSearch("Key Word")


Ref. Paul Teetor의 R Cookbook. Copyright 2011 Paul Teetor, ISBN : 9780596809157


[Using R] R Language Basic #3 - Sample Data

R Language Basic #3 - Sample Data

R Language Basic #1 Review
R Language Basic #2 Review


10. Subset, Transform, Split (데이터 프레임 조작) 
이전 데이터 프레임 샘플을 통해서 데이터프레임을 조건절로 추출하고 제외하는 방법들을 테스트 해봤을 것이다. 좀더 기본적으로 R에서 제공되는 함수를 활용하여 데이터 프레임을 조작하는 방식을 연습해보도록 한다.

> sensory.Training <- subset(sensory, Training == "Yes")
> sensory.Training
  Name Training Sweetness Saltiness
1 토니      Yes         8         4
3 모락      Yes         9         2
5 포쿡      Yes         5         1

> sensory.modified <- transform(sensory, comp=Sweetness/Saltiness)
> sensory.modified
    Name Training Sweetness Saltiness      comp
1   토니      Yes         8         4 2.0000000
2   매드       No         9         2 4.5000000
3   모락      Yes         9         2 4.5000000
4 시추안       No         4         6 0.6666667
5   포쿡      Yes         5         1 5.0000000
6 식당돈       No         5         4 1.2500000


- subset( )함수와 transform( ) 함수의 사용방법은 거의 동일하다. 좀더 세부적인 함수에 대한 내용이 보고 싶다면 help(함수명) 실행하면 함수의 기본적인 설명과 함께 인자값에 대한 내용과 샘플 소스를 얻을 수 있을 것이다. 다시 돌아가서 subset이 하위의 새로운 데이터프레임을 만들기 위한 선택 조건을 인자로 하고 transform이 새로운 변수(열) 생성을 위한 데이터 표현식을 입력인자로 한다는 점만이 틀리다는 것을 확인 할 수 있다.

> Sweetness.group <- split(sensory$Sweetness, sensory$Training)
> Sweetness.group
$No
[1] 9 4 5

$Yes
[1] 8 9 5


- split(sensory$Sweetness, sensory$Training)은 Training 벡터 값(2번째 인자)을 기준으로 Sweetness 값(1번째 인자)을 그룹화시켜 목록(lists)으로 생성하라는 표현 식이다. split( )함수는 2번째 인자를 그룹요인(grouping factor)으로 하여 1번째 인자 데이터를 그룹화한 목록으로 생성한다

> Sweetness.group.No <- sensory$Sweetness[sensory$Training == "No"]
> Sweetness.group.No
[1] 9 4 5



11. Sorting (정렬) 


> cost.pre <- c(1100, 1560, 1570, 4980, 5300, 7780, 4680)
> cost.post <- c(1530, 1650, 1890, 5910, 5310, 8900, 10600)

> sort(cost.pre)
[1] 1100 1560 1570 4680 4980 5300 7780

 - sort(cost.pre)는 단일벡터 cost.pre의 요소를 오름차순으로 정렬시킨 벡터를 결과값으로 출력한다.


> cost.post
[1]  1530  1650  1890  5910  5310  8900 10600

> order(cost.post)
[1] 1 2 3 5 4 6 7

> cost.pre[order(cost.post)]
[1] 1100 1560 1570 5300 4980 7780 4680

 - order(cost.post)은 오름차순으로 정렬된 각 요소의 색인값을 출력하는 함수로 이해 할 수 있다.

> score <- c(32, 12, 45, 54, 98, 23, 4, 56, 12, 15, 65, 23)
> gender <- rep(c("M", "F"), 6)
> age <- c(23, 12, 34, 45, 23, 56, 17, 35, 32, 34, 65, 43)
> freq.score <- data.frame(score, gender, age)

> freq.score
   score gender age
 1     32      M  23
 2     12      F  12
 3     45      M  34
 4     54      F  45
 5     98      M  23
 6     23      F  56
 7      4      M  17
 8     56      F  35
 9     12      M  32
10    15      F  34
11    65      M  65
12    23      F  43

> freq.score[order(freq.score$gender, freq.score$age),]
   score gender age
 2     12      F  12
10    15      F  34
 8     56      F  35
12    23      F  43
 4     54      F  45
 6     23      F  56
 7      4      M  17
 1     32      M  23
 5     98      M  23
 9     12      M  32
 3     45      M  34
11    65      M  65



12. Implicit loops (함수의 반복 적용) 

10명의 검사요원에게 제품의 주요특성 10가지에 대한 강도를 평가하여 데이터프레임 구조(10개의 변수 포함)로 정리된 경우를 가정해보자. 변수 각각의 평균 값을 계산하기 위해서는 앞서 소개했던 mean( )함수에 인자로 “dataframe$variable01”과 같이 변수이름을 바꿔가면서 명령을 내리면 된다. 아직 배우지는 않았지만 R이 프로그래밍언어로서 가지고 있는 for, do while 등의 반복구문을 사용하면 조금은 수고를 덜 수 있을 것이다. 그러나 제일 간단한 방법은 sapply(dataframe, mean) 이라는 함수를 사용해서 dataframe의 10개 변수 각각의 평균(mean)을 계산하는 함축적 반복 구문을 사용하는 것이다.

이와 유사한 작업들의 편리성 증대를 위해 R은 lapply( ), sapply( ), tapply( ), apply( )와 같은 함축적 반복 함수를 제공한다.

> Sourness <- c(8, 12, 3, 8, 9, 11, 9, 8, 4, 1, 14,2)
> Hardness <- c(6, 2, 9, 1, 7, 2, 3, 6, 2, 6, 1, 5)
> RedColor <- c(16, 22, 19, 61, 37, 22, 31, 26, 42, 34, 26, 51)
> Product <- rep(c("A", "B"), 6)
> Result1 <- data.frame(Sourness, Hardness)
> Result1
   Sourness Hardness
1         8        6
2        12        2
3         3        9
4         8        1
5         9        7
6        11        2
7         9        3
8         8        6
9         4        2
10        1        6
11       14        1
12        2        5

> Result2 <- data.frame(Sourness, Hardness, Product)
> Result2
   Sourness Hardness Product
1         8        6       A
2        12        2       B
3         3        9       A
4         8        1       B
5         9        7       A
6        11        2       B
7         9        3       A
8         8        6       B
9         4        2       A
10        1        6       B
11       14        1       A
12        2        5       B

*apply( ) 함수들을 사용할 때는 인자(arguments)로 na.rm=T를 입력해서 NA 데이터는 제외하는 것이 좋다.

> lapply(Result1, mean, na.rm=T)
$Sourness
[1] 7.416667

$Hardness
[1] 4.166667

> sapply(Result1, mean, na.rm=T)
Sourness Hardness
7.416667 4.166667

- lapply( ), sapply( )함수는 1번째 인자(데이터프레임: data frames)에 2번째 인자인 통계 함수를 적용시켜 목록(list: l) 또는 단순 테이블 (simplicity: s) 형태로 계산 결과값을 출력시킨다.

> tapply(Result2$Sourness, Result2$Product, mean)
       A        B
7.833333 7.000000

 - tapply( ) 함수는 1번째 인자(벡터: vector)를 2번째 인자(요인:factor)로 그룹화하여 각 그룹에 3번째 인자인 통계함수를 적용시켜 테이블(table: t) 형태로 결과값을 출력시킨다.


> R.Matrix <- cbind(Sourness, Hardness, RedColor)
> R.Matrix
      Sourness Hardness RedColor
 [1,]        8        6       16
 [2,]       12        2       22
 [3,]        3        9       19
 [4,]        8        1       61
 [5,]        9        7       37
 [6,]       11        2       22
 [7,]        9        3       31
 [8,]        8        6       26
 [9,]        4        2       42
[10,]        1        6       34
[11,]       14        1       26
[12,]        2        5       51

> apply(R.Matrix, 2, sum)
Sourness Hardness RedColor
      89       50      387

- apply( )함수는 1번째 행렬, 2번째 인자(1 = rows, 2 = columns) 방향, 3번째 인자인 통계함수를 적용시켜 그 결과를 출력.


* 데이터 프레임에 대한 데이터 조작은 이후의 포스팅에 sqldf 패키지를 활용한 가공/조작이 가능 합니다. 사실 어느쪽이 편한가는 사용자의 편의에 따라 달라질수 있으니 결국엔 결과값이 같은 내용이라면 본인이 선호하는 것을 선택하게 되어 있습니다. 


[Using R] R Language Basic #2 - Sample Data

R Language Basic #2 - Sample Data

Reference #1 - Sample Data Review 


5.  List (복합 백터 생성함수)
LIST() 함수는 두개의 워크시트에 데이터를 관리한느 방식으로 이해할 수 있다. 예를 들어 현재 운영이 되고 있는 식자재 값과 식자재가 상승한 가격의 데이터를 가지고 입력하는 경우 LIST를 활용할 수 있다.

> cost.pre <- c(1100, 1560, 1570, 4980, 5300, 7780, 9940)
> cost.post <- c(1530, 1650, 2570, 5910, 5310, 8900, 10600)
> cost1 <- list(Before=cost.pre, After=cost.post)
> cost1
$Before
[1] 1100 1560 1570 4980 5300 7780 9940

$After
[1]  1530  1650  2570  5910  5310  8900 10600

> str(cost1)
List of 2
 $ Before: num [1:7] 1100 1560 1570 4980 5300 7780 9940
 $ After : num [1:7] 1530 1650 2570 5910 5310 8900 10600

- cost1의 구조를 살표 보면 나오는 것처럼 값의 접근을 위하여 cost1$Before 를 활용하여 해당하는 열의 값을 불러 올 수 있다.

> summary(cost1)
       Length Class  Mode
Before 7      -none- numeric
After  7      -none- numeric

List() 함수 괄호안에 쓰여지는 TAG = VALUE의 형태는 이후 생성되는 데이터 접금 이름과 값에 대한 설정을 의미 한다. 위의 경우 Before, After 를 사용하였다.


> cost2 <- list(cost.pre, cost.post)
> cost2
[[1]]
[1] 1100 1560 1570 4980 5300 7780 9940

[[2]]
[1]  1530  1650  2570  5910  5310  8900 10600

> str(cost2)
List of 2
 $ : num [1:7] 1100 1560 1570 4980 5300 7780 9940
 $ : num [1:7] 1530 1650 2570 5910 5310 8900 10600

- 상위의 LIST 열에 대한 이름을 지정하지 않는 경우는 cost2$cost.pre 를 활용 할 수 없고 단순히 cost2[1], cost2[2]를 활용하여 읽어 낼 수 있다.

> summary(cost2)
     Length Class  Mode
[1,] 7      -none- numeric
[2,] 7      -none- numeric



6. Data Frames (데이터 프레임)

앞으로 우리의 과정과 데이터 분석을 위한 데이터 저장/수집되는 경우의 가장 많은 부분을 차지하는 형태의 데이터 타입 일 것이다. 데이터 프레임이라는 용어는 DataSet 또는 관계형데이터베이스의 테이블과도 비슷한 형태를 띄게 된다. 동일한 길이의 벡터 또는 요인(Factors)들의 세로방향 목록을 말하는데 각 목록의 동일위치에 있는 데이터는 동일 실험단위 또는 관찰단위에서 얻어진 것이라고 할 수 있다. 데이터 프레임의 한 행을 가리킬 때 CASE나 RECORD라는 용어를 사용하기도 한다.

> dataset.cost1 <- data.frame(Before=cost.pre, After=cost.post)

> dataset.cost1
  Before After
1   1100  1530
2   1560  1650
3   1570  2570
4   4980  5910
5   5300  5310
6   7780  8900
7   9940 10600

> str(dataset.cost1)
'data.frame': 7 obs. of  2 variables:
 $ Before: num  1100 1560 1570 4980 5300 7780 9940
 $ After : num  1530 1650 2570 5910 5310 8900 10600

> summary(dataset.cost1)
     Before         After    
 Min.   :  1100   Min.   : 1530
 1st Qu.:1565   1st Qu.: 2110
 Median :4980   Median : 5310
 Mean   :4604   Mean   : 5210
 3rd Qu.:6540   3rd Qu.: 7405
 Max.   :9940   Max.   :10600


> dataset.cost2 <- data.frame(cost.pre, cost.post)

> dataset.cost2
  cost.pre cost.post
1     1100      1530
2     1560      1650
3     1570      2570
4     4980      5910
5     5300      5310
6     7780      8900
7     9940     10600

> str(dataset.cost2)
'data.frame': 7 obs. of  2 variables:
 $ cost.pre : num  1100 1560 1570 4980 5300 7780 9940
 $ cost.post: num  1530 1650 2570 5910 5310 8900 10600

> summary(dataset.cost2)
    cost.pre      cost.post  
 Min.   :1100   Min.   : 1530
 1st Qu.:1565   1st Qu.: 2110
 Median :4980   Median : 5310
 Mean   :4604   Mean   : 5210
 3rd Qu.:6540   3rd Qu.: 7405
 Max.   :9940   Max.   :10600

DataFrame 은 List와 거의 비슷하게 생성하는 것을 사용할 수 있다. 그러나 이름지정하지 않은 경우 값의 인덱스 위치 값을 입력해야 하는 반면 데이터 프레임은 생성시 사용된 변수(입력된 팩터값 변수)의 이름을 사용하여 가능 하다.


7. Indexing (벡터 요소의 색인화)

위에서 생성된 벡터값을 개별 요소별로 접근하는 것을 색인화(Indexing)이라고 하는데 이 방법을 이요하면 하나의 벡터에서 일부분을 추출하거나 제외 할 수 있는 작업이 가능 하다. R에서 사용되는 소괄호 " () " 은 함수의 인자를 입력할 때 주로 사용하고 대괄호 " [ ] " 은 벡터나 행렬의 구성요소를 가리키는 색인 위치나 조건을 입력할 때 주로 사용한다.

> cost.pre <- c(1100, 1560, 1570, 4980, 5300, 7780, 9940)
> cost.post <- c(1530, 1650, 2570, 5910, 5310, 8900, 10600)

> cost.pre
[1] 1100 1560 1570 4980 5300 7780 9940

> cost.pre[2]
[1] 1560

> cost.pre[c(1, 3, 5)]
[1] 1100 1570 5300

> cost.pre[-c(1, 3, 5)]
[1] 1560 4980 7780 9940

> cost.pre[4:6]
[1] 4980 5300 7780

특정 위치값의 값을 추출할 때는 c() 을 사용하여 해당 색인값을 지정하고 앞에 " - " 를 붙인
cost.pre[-c(1, 3, 5)] 와 같은 것은 1, 3, 5번째 값을 제외한 내용을 추출하라는 명령이다. 기본적인 사항이지만 향후 데이터 가공하는 작업에서는 많이 사용되는 것으로 생각된다. 또한 특정 색인위치의 값을 변경하는 경우에도 사용할 수 있다.

> cost.pre[1] <- 4500


8. Conditional Selection(요소의 조건부 선택) 

대괄호 " [ ] " 안에 관계(비교)연산자와 논리연산자를 사용하여 행렬의 구성요소를 가리키는 조건을 입력할 수 있다.

> cost.pre <- c(1100, 1560, 1570, 4980, 5300, 7780, NA)
> cost.post <- c(1530, 1650, NA, 5910, 5310, 8900, 10600)

> cost.post < 2000
[1]  TRUE  TRUE    NA FALSE FALSE FALSE FALSE

> cost.pre[cost.post < 2000]
[1] 1100 1560   NA

> cost.pre[cost.post > 1500 & cost.post < 7000]
[1] 1100 1560   NA 4980 5300

> length(cost.pre)
[1] 7

> is.na(cost.pre)
[1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE

- 관계형데이터베이스에선 NULL 이라는 용어로 사용되는 값을 의미한다. 값이 존재하지 않을 경우 TRUE 값을 리턴 한다.

> !is.na(cost.pre)
[1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE

- 상위함수에서 " ! " 을 붙이는 경우는 그 반대의 경우로 표현하라고 이해 하면 된다.

> length(cost.pre[!is.na(cost.pre)])
[1] 6

기본적으로 연산자에 대한 부등기호를 한번더 정리 해보도록 하자

- 관계연산자 :
 x < y : x가 y 보다 작은 경우
 x > y : x가 y 보다 큰 경우
 x == y : x와 y가 같은 경우
 x <= y : x가 y 보다 작거나 같은 경우
 x >= y : x가 y 보다 크거나 같은 경우
 x != y : x와 y가 같지 않은 경우

- 논리연산자 : AND/그리고( & ) , OR/또는 ( | ) , NOT/아니다 ( ! )


9. Indexing of Data Frames (데이터프레임 요소의 색인화)

데이터프레임 형태의 구조가 가장 많을 것이라고 기존의 포스팅에서 설명한 바 있다. 데이터프레임 요소의 색인화는 대괄호(" [] " )를 사용하여 2차원 배열과 같은 형태로 이뤄지면 이전에서 설명한 색인화와 동일한 형태이니 간단한 샘플 소스를 보면 이해가 쉬울 것으로 생각 된다.


> Name <- c("토니", "매드", "모락", "시추안", "포쿡", "식당돈")
> Training <- c("Yes", "No", "Yes", "No", "Yes", "No")
> Sweetness <- c(8, 9, 9, 4, 5, 5)
> Saltiness <- c(4, 2, 2, 6, 1, 4)
> sensory <- data.frame(Name, Training, Sweetness, Saltiness)

> sensory
    Name   Training Sweetness Saltiness
1   토니       Yes         8              4
2   매드        No         9               2
3   모락       Yes         9              2
4 시추안       No         4              6
5   포쿡       Yes         5              1
6 식당돈       No         5              4

> str(sensory)
'data.frame': 6 obs. of  4 variables:
 $ Name     : Factor w/ 6 levels "매드","모락",..: 5 1 2 3 6 4
 $ Training : Factor w/ 2 levels "No","Yes": 2 1 2 1 2 1
 $ Sweetness: num  8 9 9 4 5 5
 $ Saltiness: num  4 2 2 6 1 4

> summary(sensory)
     Name   Training   Sweetness       Saltiness  
 매드  :1     No :3      Min.   :4.000     Min.   :1.000
 모락  :1     Yes:3    1st Qu.:5.000    1st Qu.:2.000
 시추안:1                Median :6.500   Median :3.000
 식당돈:1                Mean   :6.667    Mean   :3.167
 토니  :1                  3rd Qu.:8.750    3rd Qu.:4.000
 포쿡  :1                  Max.   :9.000     Max.   :6.000

- 샘플 데이터로 만들어진 데이터 프레임을 확인 할 수 있다. str() 함수는 데이터프레임의 각 항목의 데이터 구조 형태를 볼 수 있고 summary() 함수는 데이터프레임의 각항목별 최저/최대값과 중간값, 평균등을 요약형태로 볼 수 있으며 향후 데이터 가공 작업시 유용하게 사용할 수 있다.

> sensory[5, 2]
[1] Yes
Levels: No Yes

> sensory[5,]
  Name Training Sweetness Saltiness
5 포쿡      Yes         5         1

> sensory[, 1]
[1] 토니   매드   모락   시추안 포쿡   식당돈
Levels: 매드 모락 시추안 식당돈 토니 포쿡

> condition <- sensory$Training == "Yes"
> sensory[condition,]
  Name Training Sweetness Saltiness
1 토니      Yes         8         4
3 모락      Yes         9         2
5 포쿡      Yes         5         1

> sensory[sensory$Sweetness > 5,]
  Name Training Sweetness Saltiness
1 토니      Yes         8         4
2 매드       No         9         2
3 모락      Yes         9         2

데이터 프레임의 개별 요소 값을 접근하기 위해서는 기본적인 " [ 행, 열 ] " 이라는 구조로 사용이 가능 하다. 또한 [행, ], [ , 열] 을 사용하여 지정하지 않은 경우는 모든 행과 모든 열을 가리키게 된다.


#3 Sample Data 로 계속

 다양한 채널의  블로그 작성으로  집중이 좀 안되기도 하고  나의 회사를 운영하고 관리 하다 보니  회사의 블로그로 작성 해보는 것은 어떤가 하고  하나로 옮겨 봅니다.  (주)다이닝웨이브 - 블로그 바로가기