2013-08-04 2 views
6

This question은 어떤 판다가 리샘플링을 하는지를 R 단위로 집계합니다. 가장 유용한 대답은 XTS 패키지를 사용하여 주어진 기간별로 그룹화하고 sum() 또는 mean()과 같은 일부 함수를 적용하는 것입니다.윤활유의 기간별 집계

거기에 제안 된 의견 중 하나는 비슷한 윤곽이 있었지만 정교하지는 못했습니다. 누군가가 lubridate를 사용하여 관용적 인 예를 제공 할 수 있습니까? 나는 lubridate 비네팅을 몇 번 읽었고 lubridate와 plyr의 조합을 상상할 수 있지만, 내가 놓친 쉬운 방법이 없는지 확인하고 싶다.

이의 내가이 데이터 집합에서 북쪽으로 이동하는 자전거의 일상 합계를 원하는 가정 해 봅시다, 예보다 실제 만들려면 :

library(lubridate) 
library(reshape2) 

bikecounts <- read.csv(url("http://data.seattle.gov/api/views/65db-xm6k/rows.csv?accessType=DOWNLOAD"), header=TRUE, stringsAsFactors=FALSE) 
names(bikecounts) <- c("Date", "Northbound", "Southbound") 

데이터는 다음과 같습니다

> head(bikecounts) 
        Date Northbound Southbound 
1 10/02/2012 12:00:00 AM   0   0 
2 10/02/2012 01:00:00 AM   0   0 
3 10/02/2012 02:00:00 AM   0   0 
4 10/02/2012 03:00:00 AM   0   0 
5 10/02/2012 04:00:00 AM   0   0 
6 10/02/2012 05:00:00 AM   0   0 

답변

6

나도 몰라 왜 당신이 이것을 위해 윤활유를 사용할까요? 그냥 XTS보다 멋진 무언가를 찾고 있다면 당신은 단지 다음 함수를 적용, 날짜로 split 필요, 기본적으로이

tapply(bikecounts$Northbound, as.Date(bikecounts$Date, format="%m/%d/%Y"), sum) 

시도 할 수 있습니다.


lubridate는 분할 적용 문제의 그룹화 요인을 생성하는 데 사용할 수 있습니다. 따라서, 예를 들어, 각 달의 합을 원하는 경우 (무시 년)

tapply(bikecounts$Northbound, month(mdy_hms(bikecounts$Date)), sum) 

하지만, 그냥 기본 R 기능에 대해 래퍼를 사용하고, 그리고 영업 이익의 경우는 기본 R 기능을 생각 as.Date 가장 쉬운 방법입니다 (다른 답변도 윤활유 사용 요청을 무시한다는 사실에서 알 수 있습니다 .-)). 영업에 연결된 다른 QuestionAnswer에 포함되지 않은


뭔가 split.xts입니다. period.applyxtsendpoints으로 분할하고 각 그룹에 기능을 적용합니다. endpoints 기능으로 주어진 태스크에 유용한 엔드 포인트를 찾을 수 있습니다. 예를 들어 xts 객체가 x 인 경우 endpoints(x, "months")은 매월 마지막 행 인 행 번호를 제공합니다. split.xts은이를 활용하여 xts 객체를 분할합니다. split(x, "months")은 각 구성 요소가 다른 달인 xts 객체 목록을 반환합니다.

split.xts()endpoints()은 주로 xts 개체를 대상으로하지만, 일반 시간 기반 벡터를 비롯한 다른 개체에서도 작동합니다. 당신이 XTS 객체를 사용하지 않을 경우에도 때문에 편리 또는 (C에서 구현)의 속도

> split.xts(as.Date("1970-01-01") + 1:10, "weeks") 
[[1]] 
[1] "1970-01-02" "1970-01-03" "1970-01-04" 

[[2]] 
[1] "1970-01-05" "1970-01-06" "1970-01-07" "1970-01-08" "1970-01-09" 
[6] "1970-01-10" "1970-01-11" 

> endpoints(as.Date("1970-01-01") + 1:10, "weeks") 
[1] 0 3 10 

endpoints()에 대한 용도를 찾을 수 있습니다 나는이 문제에 lubridate 최고의 사용은 구문 분석에 대한 생각 "날짜"문자열을 POSIXct 객체에 넣습니다. 이 경우에는 mdy_hms 기능을 사용합니다.

여기에 을 사용하여 "날짜"문자열을 구문 분석하는 xts 솔루션이 있습니다.이 특정 작업을 위해

x <- xts(bikecounts[, -1], mdy_hms(bikecounts$Date)) 
period.apply(x, endpoints(x, "days"), sum) 
apply.daily(x, sum) # identical to above 

xts

period.sum(x, endpoints(x, "days")) 
+0

이것은 유용합니다. 합의가 "윤활유를 사용하지 말고 XTS를 사용하십시오."라고 대답한다면이 대답을 받아 들여야합니다. 즉, "사용하는 윤활유"라는 말을 많이 들었습니다. 그래서 나는 그 소란스러운 것이 무엇인지 배우고 싶습니다. – Peter

+1

나는 @GSee와 동의하는 경향이있다. 'lubridate' 함수를 사용하여'ddply' 가능한 그룹화 변수를 얻는 가장 쉬운'lubridate '방법은'bikecounts $ date2 <- mdy_hms (x = bikecounts $ Date)'입니다; 'bikecounts $ date3 <- round_date (x = bc $ date2, unit = "day")'. – Henrik

+0

누구나 답변을 얻을 수 있습니다. 이것에 대한 소품 1.) 나의 시작 전제 정정 2.) 기초 제공 R 예 3.) 윤활유 버전이 어떻게 보이는지 보여주고, 4.) xts의 이점을 설명합니다. – Peter

2

여기에 매우 빠른 (포트란으로 작성) 최적화 period.sum 기능입니다 그 CSV를 가져온 후 data.table 를 사용하여 옵션이있다 :

library(data.table) 

# convert the data.frame to data.table 
bikecounts <- data.table(bikecounts) 

# Calculate 
bikecounts[, list(NB=sum(Northbound), SB=sum(Southbound)), by=as.Date(Date, format="%m/%d/%Y")] 

     as.Date NB SB 
    1: 2012-10-02 1165 773 
    2: 2012-10-03 1761 1760 
    3: 2012-10-04 1767 1708 
    4: 2012-10-05 1590 1558 
    5: 2012-10-06 926 1080 
---      
299: 2013-07-27 1212 1289 
300: 2013-07-28 902 1078 
301: 2013-07-29 2040 2048 
302: 2013-07-30 2314 2226 
303: 2013-07-31 2008 2076 

참고 :data.table 패키지에서("빠른 읽기")을 사용하여 CSV에서 한 번에 data.table으로 읽을 수 있습니다. 문자열에서 날짜/시간을 수동으로 변환하는 것이 유일한 단점입니다.

eg: 
bikecounts <- fread("http://data.seattle.gov/api/views/65db-xm6k/rows.csv?accessType=DOWNLOAD", header=TRUE, stringsAsFactors=FALSE) 
setnames(bikecounts, c("Date", "Northbound", "Southbound")) 
bikecounts[, Date := as.POSIXct(D, format="%m/%d/%Y %I:%M:%S %p")] 
+1

이 대답은 정말 빠른 집계가 필요한 곳에서도 매우 좋습니다. 벤치 마크를하지 않고서는이 방법이 가장 빠를 것이라고 확신합니다. – Peter

+0

데이터 테이블을 lubridate 또는 fasttime과 혼합하는 것은 어떨까요? – skan

2

plyr 패키지에서 ddply 사용 : 여기

library(plyr) 
bikecounts$Date<-with(bikecounts,as.Date(Date, format = "%m/%d/%Y")) 
x<-ddply(bikecounts,.(Date),summarise, sumnorth=sum(Northbound),sumsouth=sum(Southbound)) 


> head(x) 
     Date sumnorth sumsouth 
1 2012-10-02  1165  773 
2 2012-10-03  1761  1760 
3 2012-10-04  1767  1708 
4 2012-10-05  1590  1558 
5 2012-10-06  926  1080 
6 2012-10-07  951  1191 


> tail(x) 
      Date sumnorth sumsouth 
298 2013-07-26  1964  1999 
299 2013-07-27  1212  1289 
300 2013-07-28  902  1078 
301 2013-07-29  2040  2048 
302 2013-07-30  2314  2226 
303 2013-07-31  2008  2076 
1

되어 나는 또한 링크 된 질문에 추가 요청 lubridate 솔루션.

ts.month.sum <- aggregate(zoo.ts, month, sum) 

ts.daily.mean <- aggregate(zoo.ts, day, mean) 

ts.mins.mean <- aggregate(zoo.ts, minutes, mean) 

물론, 당신이 먼저 충분히 쉽게 동물원() 객체에 데이터를 변환해야합니다 : 그것은 이러한 작업에 대한 lubridate동물원 집계()의 조합을 사용합니다. 또한 yearmon() 또는 yearqtr() 또는 의 사용자 정의 함수를으로 분할하여 적용 할 수 있습니다. 이 방법은 문법적으로 달콤한 팬더 것과 같습니다.