일별 데이터를 월 / 년 간격으로 집계
나는 종종 R에서 날짜로 작업 할 필요가 없지만 이것이 상당히 쉽다고 생각합니다. 데이터 프레임의 날짜를 나타내는 열이 있습니다. 날짜를 사용하여 월 / 연도별로 두 번째 열을 요약하는 새 데이터 프레임을 만들고 싶습니다. 가장 좋은 방법은 무엇입니까?
두 번째 데이터 프레임이 필요하므로 플롯에 제공 할 수 있습니다.
제공 할 수있는 모든 도움을 주시면 대단히 감사하겠습니다!
편집 : 참고 :
> str(temp)
'data.frame': 215746 obs. of 2 variables:
$ date : POSIXct, format: "2011-02-01" "2011-02-01" "2011-02-01" ...
$ amount: num 1.67 83.55 24.4 21.99 98.88 ...
> head(temp)
date amount
1 2011-02-01 1.670
2 2011-02-01 83.550
3 2011-02-01 24.400
4 2011-02-01 21.990
5 2011-02-03 98.882
6 2011-02-03 24.900
이와 달 및 년에 더 우아한 해결책하지만 분할은 아마도 strftime()
다음 aggregate()
을 수행해야합니다 보내고. 그런 다음 플로팅을 위해 날짜를 다시 조립하십시오.
x <- as.POSIXct(c("2011-02-01", "2011-02-01", "2011-02-01"))
mo <- strftime(x, "%m")
yr <- strftime(x, "%Y")
amt <- runif(3)
dd <- data.frame(mo, yr, amt)
dd.agg <- aggregate(amt ~ mo + yr, dd, FUN = sum)
dd.agg$date <- as.POSIXct(paste(dd.agg$yr, dd.agg$mo, "01", sep = "-"))
나는 그것을 할 거라고 lubridate
하고 plyr
그들을 쉽게 그릴 수 있도록 가장 가까운 달 아래 날짜를 반올림 :
library(lubridate)
df <- data.frame(
date = today() + days(1:300),
x = runif(300)
)
df$my <- floor_date(df$date, "month")
library(plyr)
ddply(df, "my", summarise, x = mean(x))
게임에 조금 늦었지만 다른 옵션은 다음을 사용하는 것입니다 data.table
.
library(data.table)
setDT(temp)[, .(mn_amt = mean(amount)), by = .(yr = year(date), mon = months(date))]
# or if you want to apply the 'mean' function to several columns:
# setDT(temp)[, lapply(.SD, mean), by=.(year(date), month(date))]
이것은 제공합니다 :
yr mon mn_amt
1: 2011 februari 42.610
2: 2011 maart 23.195
3: 2011 april 61.891
월의 숫자 대신 이름을 원하는 경우 다음을 사용할 수 있습니다.
setDT(temp)[, date := as.IDate(date)
][, .(mn_amt = mean(amount)), by = .(yr = year(date), mon = months(date))]
이것은 제공합니다 :
yr mon mn_amt
1: 2011 februari 42.610
2: 2011 maart 23.195
3: 2011 april 61.891
보시다시피 이것은 시스템 언어 (제 경우 네덜란드어)로 월 이름을 제공합니다.
또는 조합 사용 lubridate
과 dplyr
:
temp %>%
group_by(yr = year(date), mon = month(date)) %>%
summarise(mn_amt = mean(amount))
사용 된 데이터 :
# example data (modified the OP's data a bit)
temp <- structure(list(date = structure(1:6, .Label = c("2011-02-01", "2011-02-02", "2011-03-03", "2011-03-04", "2011-04-05", "2011-04-06"), class = "factor"),
amount = c(1.67, 83.55, 24.4, 21.99, 98.882, 24.9)),
.Names = c("date", "amount"), class = c("data.frame"), row.names = c(NA, -6L))
이를 위해 xts 패키지를 사용하십시오.
library(xts)
ts <- xts(temp$amount, as.Date(temp$date, "%Y-%m-%d"))
# convert daily data
ts_m = apply.monthly(ts, FUN)
ts_y = apply.yearly(ts, FUN)
ts_q = apply.quarterly(ts, FUN)
여기서 FUN은 데이터를 집계하는 함수입니다 (예 : 합계).
다음과 같이 할 수 있습니다.
short.date = strftime(temp$date, "%Y/%m")
aggr.stat = aggregate(temp$amount ~ short.date, FUN = sum)
monyr
이런 종류의 작업에 사용 하는 기능 이 있습니다.
monyr <- function(x)
{
x <- as.POSIXlt(x)
x$mday <- 1
as.Date(x)
}
n <- as.Date(1:500, "1970-01-01")
nn <- monyr(n)
데이터의 날짜 형식과 일치하도록 as.Date
끝을 as.POSIXct
로 변경할 수 있습니다 . 월별로 요약하는 것은 집계 / 기준 / 등을 사용하는 문제입니다.
dplyr
옵션은 다음과 같습니다 .
library(dplyr)
df %>%
mutate(date = as.Date(date)) %>%
mutate(ym = format(date, '%Y-%m')) %>%
group_by(ym) %>%
summarize(ym_mean = mean(x))
또한 시계열이 xts 형식 인 것 같으면 다음과 같은 mean 함수를 사용하여 일일 시계열을 월별 시계열로 집계 할 수 있습니다.
d2m <- function(x) {
aggregate(x, format(as.Date(zoo::index(x)), "%Y-%m"), FUN=mean)
}
또 하나의 솔루션 :
rowsum(temp$amount, format(temp$date,"%Y-%m"))
For plot you could use barplot
:
barplot(t(rowsum(temp$amount, format(temp$date,"%Y-%m"))), las=2)
ReferenceURL : https://stackoverflow.com/questions/6052631/aggregate-daily-data-to-month-year-intervals
'programing' 카테고리의 다른 글
C # 4.0 : 기본값이있는 선택적 매개 변수로 Color를 사용할 수 있습니까? (0) | 2021.01.18 |
---|---|
Java : 배열의 하위 집합을 선택하는 쉬운 방법이 있습니까? (0) | 2021.01.18 |
자바의 최종 배열 (0) | 2021.01.18 |
C #에서 저장 프로 시저 출력 매개 변수 사용 (0) | 2021.01.18 |
이미 존재하는 프로그램 유형 : android.support.v4.app.BackStackRecord (0) | 2021.01.17 |