20180131damlbmp_zone.csv
다운로드

데이터 파일을 첨부했으니 다운로드 받아서 테스트 해 보기 바란다. 내 컴퓨터의 R 작업 디렉토리에 풀어 놓고 다음 명령으로 데이터를 불러 보자.

 

> ep<-read.csv("20180131damlbmp_zone.csv")

 

불러들인 데이터는 ep란 이름의 데이터셋에 저장했다. csv 파일의 첫 행을 변수 이름으로 자동 인식했다. 변수 이름을 따로 보고 싶으면 names() 함수를 쓴다.

 

> names(ep)
[1] "Time.Stamp"                        "Name"                             
[3] "PTID"                              "LBMP....MWHr."                    
[5] "Marginal.Cost.Losses....MWHr."     "Marginal.Cost.Congestion....MWHr."

 

여섯 개의 변수로 구성되어 있는 것을 알 수 있는데, 이름을 보면 통계 분석을 위한 변수명이라기 보다는 문서에 있는 표의 첫 줄 같다. 풀 네임으로 되어 있으니까. 간결한 변수명으로 일단 바꾸고 싶으면 다음과 같이 한다.

 

 c("time_stamp","name","ptid","lbmp","mcl","mcc")->names(ep)
> names(ep)
[1] "time_stamp" "name"       "ptid"       "lbmp"       "mcl"        "mcc"

 

데이터 내용은 굳이 설명할 필요가 없을 것 같다. 만약 이 중에서 시간(time_stamp), 지역 이름(name), 지역 아이디(ptid), 가격(lbmp) 네 개의 변수만 가진 새로운 데이터셋 epa를 만들고 싶다면 다음과 같이 만들면 된다. 데이터 이름과 변수 이름을 문자열로 어떻게 처리하는지 주의해서 보기 바란다.

 

> epa<-ep[c("time_stamp","name","ptid","lbmp")]
> head(epa)
        time_stamp   name  ptid  lbmp
1 01/31/2018 00:00 CAPITL 61757 45.49
2 01/31/2018 00:00 CENTRL 61754 34.40
3 01/31/2018 00:00 DUNWOD 61760 43.76
4 01/31/2018 00:00 GENESE 61753 33.40
5 01/31/2018 00:00    H Q 61844 30.45
6 01/31/2018 00:00 HUD VL 61758 43.54

 

원하는 변수만을 뽑아 새로운 데이터를 만들 수 있다면, 원하는 행만을 뽑아 새로운 변수를 만들 수도 있을 것이다. 이때는 subset() 함수를 사용한다. 만약 지역 이름이 'CAPITL' 또는 'GENESE'인 행만 선택해 새로운 데이터셋 epb를 만들고 싶다면,

 

> epb<-subset(epa,name==c("CAPITL","GENESE"))
> head(epb)
         time_stamp   name  ptid  lbmp
1  01/31/2018 00:00 CAPITL 61757 45.49
4  01/31/2018 00:00 GENESE 61753 33.40
31 01/31/2018 02:00 CAPITL 61757 36.80
34 01/31/2018 02:00 GENESE 61753 32.79
61 01/31/2018 04:00 CAPITL 61757 37.46
64 01/31/2018 04:00 GENESE 61753 34.32

 

결과를 보면 어떻게 된 건지 금방 알 수 있을 것이다. 수치 데이터인 경우, 수학적 조건을 건 부분집합을 만들 수도 있다. 이 때는 which() 함수를 기억하자. 만약 epa에서 변수 lbmp가 35보다 큰 행만 골라서 새로운 데이터셋 epc를 만들고 싶으면,

 

> epc<-epa[which(epa$lbmp>35),]
> head(lbmp0131c)
        time_stamp   name  ptid  lbmp
1 01/31/2018 00:00 CAPITL 61757 45.49
3 01/31/2018 00:00 DUNWOD 61760 43.76
6 01/31/2018 00:00 HUD VL 61758 43.54
7 01/31/2018 00:00 LONGIL 61762 55.39
8 01/31/2018 00:00 MHK VL 61756 35.07
9 01/31/2018 00:00 MILLWD 61759 43.87

 

데이터과 관련된 명령은 꼭 알아야 하는 게 정말 많다. 한꺼번에 다 쓰기엔 너무 기니까 다음에 이어 살펴보기로 한다.

Posted by jujaeuk
,

2012년 2월 20일. 벌써 6년 전입니다. 고양이를 기르고 싶어서 고양이 까페의 분양 글들을 매일같이 구경하다가 한 녀석이 눈에 밟히게 됐습니다. 생후 3개월 정도로 추정되는 아기 고양이 티를 막 벗기 시작할 무렵의 고등어였는데, 구조 당시 꼬리에 고무줄이 감겨 있어서 꼬리 절반이 괴사 상태였다고 합니다.

 

어느 착한 분이 구조해서 병원에 데려가 꼬리 절단 수술을 했고, 데려가서 키울 사람을 찾는다는 공고를 인터넷 고양이 까페에 냈습니다. 태어나 한번도 반려동물을 키워 본 경험이 없어서 망설이기도 했지만 용기를 내서 결국 연락을 했습니다.

 

지금도 내 인생에 제일 잘 한 결정 중 하나라고 생각을 합니다. 삼순이와의 인연은 그렇게 시작됐습니다. 보호자를 만나러 갔을 때 처음 본 삼순이는 이미 어른인 다른 고양이 세마리랑 같이 살고 있었는데 새로 사 온 이동장 문을 열었더니 알아서 들어가더라는...

 

 

처음 집으로 데려 왔을 때 모습입니다. 낯선 곳에서 겁을 먹어서 어두운 곳에 짱박혀서 한동안 나오려고 하지 않았습니다.

 

 

삼순이가 앉을 곳과 밥과 물을 차려 놨었는데, 밝은 곳으로 나오기까지 며칠이 걸렸습니다. 이 사진은 처음 집에 온지 닷새 뒤에 찍은 겁니다. 여기 저기 둘러보기도 하고,

 

 

꾸벅꾸벅 졸기도 하고 그랬습니다. 조금은 안정을 찾은 듯 보였습니다.

 

 

나중엔 이렇게 의자에 올라가 잠을 자기도 했지요.

 

 

장난감을 흔들면 좋아라 했습니다. (카메라가 안 좋아서 쫓아 다니는 장면은 다 실패ㅡㅡ;)

 

 

저 때는 저 빨간 담요를 좋아했는데, 삼순이는 같은 물건을 오래 좋아하진 않았고, 깨끗한 걸 좋아해서 담요나 쿠션 같은 건 자주 빨아줘야 깔고 앉곤 했습니다.

 

 

처음 사준 캣타워. 처음엔 잘 갖고 놀았습니다.

'우리집 고양이' 카테고리의 다른 글

삼순이 (2012. 5 ~ 9)  (2) 2018.05.28
봄, 그리고 삼순 (2012. 3. 24 - 4. 30)  (0) 2018.05.05
토요일 아침 삼순 (2012. 3. 17-23)  (0) 2018.04.11
삼순이, 2012년 3월  (0) 2018.03.28
새로운 식구를 만나다  (0) 2018.03.20
Posted by jujaeuk
,

R에서 데이터 다루기

R 2018. 3. 13. 10:53

변수에 스칼라 값을 넣으려면 <- 기호를 쓴다.

 

> a<-1
> a
[1] 1

 

변수에 벡터 값을 넣으려면 <-에 c() 함수를 쓴다.

 

> a<-c(1,2,3)
> a
[1] 1 2 3

 

변수에 매트릭스를 넣으려면 matrix() 함수를 쓴다. 인자로, 벡터값과 nrow, ncol을 넣는다.

 

> a<-matrix(c(10,20,30,40,50,60),2,3)
> a
     [,1] [,2] [,3]
[1,]   10   30   50
[2,]   20   40   60

 

위 예제를 보면 벡터 값이 앞열부터 순서대로 채워지는데, 첫행부터 채워지게 만들려면 byrow 옵션을 쓴다.

 

> a<-matrix(c(10,20,30,40,50,60),2,3,byrow=T)
> a
     [,1] [,2] [,3]
[1,]   10   20   30
[2,]   40   50   60

 

매트릭스의 행과 열을 바꾸고 싶으면, 즉 transpose하고 싶으면 t() 함수를 쓴다.

 

> b<-t(a)
> b
     [,1] [,2]
[1,]   10   40
[2,]   20   50
[3,]   30   60

 

매트릭스의 각 열을 변수로 한 데이터셋을 만들고 싶으면 data.frame() 함수를 쓴다. 변수 이름은 자동으로 X1, X2가 붙는다.

 

> c<-data.frame(b)
> c
  X1 X2
1 10 40
2 20 50
3 30 60

 

매트릭스가 아닌 벡터를 모아서 데이터셋을 만들 수도 있다. 각각의 벡터는 변수 이름을 가지고 있기 때문에 매트릭스 때와 달리 벡터 이름이 변수 이름이 된다.

 

> a<-c(1,2,3,4,5,6)
> b<-c(10,12,13,15,17,18)
> c<-data.frame(a,b)
> c
  a  b
1 1 10
2 2 12
3 3 13
4 4 15
5 5 17
6 6 18

 

data.frame()안에 인자로 들어갈 벡터는 몇개라도 상관없다.

 

일반적인 경우에 데이터셋을 콘솔 화면에서 타이핑해서 만드는 경우는 거의 없고, 파일을 불러들여서 만든다. 제일 많이 쓰는 데이터파일 포맷은 csv (comma-separated values)인데 R에서 csv 파일을 부를 땐 read.csv() 함수를 쓴다.

 

> data<-read.csv("testdata1.csv")
> data
   year          gdp
1  1960 3.957874e+09
2  1961 2.417238e+09
3  1962 2.813934e+09
...

 

파일 첫 줄에 변수 이름이 있고, 다른 설명이나 캡션이 없는 깔끔한 csv 파일인 경우, 별도의 옵션 설정 없이 변수 이름과 값을 불러들인다. 저장할 땐 write.csv() 함수를 쓴다. 데이터 이름과 파일 이름을 명시해야 한다.

 

> write.csv(data,file="testdata2.csv")

 

csv 외에 R에서 제공하는 데이터 포맷도 있다. RData라는 확장자를 쓰는데 RData 파일로 저장하려면 save() 함수를 쓴다.

 

> save(data,file="test.RData")

 

RData 파일을 부를 땐 load() 함수를 쓴다.

 

> load("test.RData")

 

R에서 변수를 사용할 때는 변수 이름만 쓰면 안되고 데이터셋 이름까지 써 줘야 한다. 데이터셋$변수명 이런식으로 쓴다.

> data$year
 [1] 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974
[16] 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989
[31] 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004
[46] 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016
Posted by jujaeuk
,

일단 가장 기본적인 막대그래프는 barplot() 함수로 그릴 수 있다. 예제는 gcookbook 패키지를 쓴다.

 

> library(gcookbook)
> BOD
  Time demand
1    1    8.3
2    2   10.3
3    3   19.0
4    4   16.0
5    5   15.6
6    7   19.8
> barplot(BOD$demand)

 

아래 그림과 같은 결과가 화면에 뜬다.

가로축에 라벨을 붙이고 싶으면

> barplot(BOD$demand,names.arg=BOD$Time)

Time=6에 해당하는 그래프가 없는 것이 좀 찜찜하다면 ggplot2 패키지에 ggplot() 함수를 쓰면 된다.

> library(ggplot2)
> ggplot(BOD,aes(x=Time,y=demand))+geom_bar(stat="identity")

 

ggplot()으로 6 없이 가는 방법도 있다. Time 변수를 factor()로 처리해 주면 된다.

 

> ggplot(BOD,aes(x=factor(Time),y=demand))+geom_bar(stat="identity")

 

 

참고문헌: 윈스턴 챙 지음, 이제원 옮김, <R Graphics Cookbook> O'Reilly, 인사이트

Posted by jujaeuk
,

Sys.Date()는 오늘 날짜를 Date class로 보여주고, Sys.time()은 오늘 날짜, 시간을 POSIXct class로 보여준다. strptime() 함수로 반환된 값의 class는 리스트 형식인 POSIXlt였는데 이번엔 POSIXct이다. POSIXct는 1970년 1월 1일 0시 0분 0초를 0으로 정하고 1초에 1씩 증가시킨 정수 값이다.

> nowtime<-Sys.time()
> nowtime
[1] "2018-03-07 16:37:43 KST"
> class(nowtime)
[1] "POSIXct" "POSIXt" 
> nowdate<-Sys.Date()
> nowdate
[1] "2018-03-07"
> class(nowdate)
[1] "Date"
> as.integer(nowtime)
[1] 1520408263
> futuretime<-nowtime+3*60*60
> futuretime
[1] "2018-03-07 19:37:43 KST"

즉, POSIXct 형식으로 반환된 변수인 nowtime은 as.integer() 삼수를 통해 정수로 변환이 가능하고, 세시간 뒤를 알고 싶으면 변수에 3*60*60을 더해주면 된다.

> begin<-strptime("1970-01-01 00:00:00","%Y-%m-%d %H:%M:%S")
> begin1<-as.POSIXct(begin)
> begin1
[1] "1970-01-01 KST"
> begin2<-as.integer(begin1)
> begin2
[1] -32400

1970년 1월 1일 0시 0분 0초를 begin이란 변수에 받고 이를 as.POSIXct() 함수를 통해 변환한 뒤 다시 as.integer() 함수로 변환하면 -32400을 반환한다. 이는 KST라는 timezone이 그리니치 표준시보다 9시간(32400=9*60*60) 이르기 때문이다.

'R' 카테고리의 다른 글

R 데이터 변형하기 - subset(), which()  (0) 2018.03.19
R에서 데이터 다루기  (0) 2018.03.13
R 막대그래프 barplot(), ggplot()  (0) 2018.03.09
R에서 시간 처리하기 strptime()  (0) 2018.03.06
R에서 날짜 다루는 법 as.Date()  (0) 2018.03.05
Posted by jujaeuk
,

as.Date()가 날짜를 처리한다면 strptime() 함수는 시간을 처리한다.

 

> now<-strptime("2018-03-06 17:45:00","%Y-%m-%d %H:%M:%S")
> now
[1] "2018-03-06 17:45:00 KST"
> class(now)
[1] "POSIXlt" "POSIXt" 

strptime() 함수는 날짜처럼 생긴 문자열을 받아서 사람이 지정한 포맷으로 R이 읽게 해서 시간으로 이해하게끔 하는 함수이다. as.Date() 함수는 년월일을 y-m-d 순서로 써 주면 알아서 날짜로 읽어 들이는데 시간은 표시하는데 워낙 다양한 포맷이 있다 보니 사람이 읽는 형식을 지정하게끔 만들어 놨다. 뒤에 보이는 "%Y-%m-%d %H:%M:%S"가 바로 그 앞에 나온 문자열을 읽는 형식이다. 보면 대충 이해가 되겠지만 년(%Y)월(%m)일(%d)이 대시(-)로 연결한 형태이고, 시(%H)분(%M)초(%S)가 콜론(:)으로 연결한 형태이니 그렇게 알고 읽어 들이라는 뜻이다.

 

POSIXlt는 시간을 컴퓨터로 표시하는 표준 포맷인데 시간 정보를 리스트 형식으로 저장하고 있다. 이제 POSIXlt class인 변수 now를 해부해 보자.

 

> now$year
[1] 118
> now$mon
[1] 2
> now$mday
[1] 6
> now$hour
[1] 17
> now$min
[1] 45
> now$sec
[1] 0
> now$wday
[1] 2

좀 특이하다. year=118은 1900년을 0으로 표준화한 값으로, now가 가진 년도에 1900을 뺀 수치이다. mon=2는 1월을 0으로 표준화한 값으로, now가 가진 달에 1을 뺀 수치이다. mday=6은 6일 그대로이고, hour, min, sec도 그대로이며, wday는 일요일을 0으로 1씩 증가시킨 요일 값으로, 화요일이란 뜻이다.

Posted by jujaeuk
,

R에서 변수 a에게 날짜 모양의 문자열을 저장하면 그건 문자열이지 날짜가 아니다. 2월 25일의 닷세 뒤는 3월 2일이고, 올해가 윤년이면 3월 1일이 된다는 걸 알게 하려면 변수에 저장된 문자열을 날짜 형식으로 변환해 주어야 하는데 그 때 사용되는 함수가 as.Date()이다. 다음 예제를 보자.

 

> a<-"2018-2-25"
> a
[1] "2018-2-25"
> a+5 Error in a + 5 : non-numeric argument to binary operator
> class(a)
[1] "character"
> b<-as.Date(a)
> b
[1] "2018-02-25"
> b+5
[1] "2018-03-02"
> class(b)
[1] "Date"

a에게 "2018-2-25"라는 문자열을 저장했을 땐 a+5같은 연산이 작동을 하지 않았다. class() 함수로 변수의 종류를 살펴보면 "character"라고 나온다. 다시 a를 as.Date() 함수로 변환하여 b에 저장한 후 b+5 연산을 해 보면 이젠 정확하게 "2018-03-02"를 표시해 주는 걸 볼 수 있다. Date class인 변수 a가 저장하고 있는 값은 1970년 1월 1일을 0으로 정하고 이후 하루가 지날 때마다 1씩 증가하는 값을 가진 정수이다.

> as.integer(b)
[1] 17587

즉, 변수 b가 갖고 있는 2018년 2월 25일은 1970년 1월 1일로부터 17587일이 지난 날이다. 문자열이 아닌 정수 17587을 Date class로 변환할 수 있을까? 가능하다. 다만, 반드시 origin을 필요로 한다.

> c<-as.Date(17587)
Error in as.Date.numeric(17587) : 'origin'이 반드시 주어져야 합니다
> c<-as.Date(17587,origin="1970-1-1")
> c
[1] "2018-02-25"

origin은 반드시 1970년 1월 1일이어야 할 필요는 없다.

Posted by jujaeuk
,