R сбрасывает совокупное значение в ноль в начале каждого года - PullRequest
5 голосов
/ 16 декабря 2011

У меня есть dataframe с кучей данных пожертвований.Я беру данные и располагаю их во времени в порядке от самых старых до самых последних подарков.Затем я добавляю столбец, содержащий накопленную сумму подарков за время.Данные содержат данные за несколько лет, и я искал хороший способ для сброса cumsum в 0 в начале каждого года (год начинается и заканчивается 1 июля для финансовых целей).

Этокак это в настоящее время:

id        date          giftamt      cumsum()
005       01-05-2001     20.00        20.00
007       06-05-2001     25.00        45.00
009       12-05-2001     20.00        65.00
012       02-05-2002     30.00        95.00
015       08-05-2002     50.00       145.00
025       12-05-2002     25.00       170.00
...          ...          ...         ...

вот как я бы хотел, чтобы это выглядело:

id        date          giftamt      cumsum()
005       01-05-2001     20.00        20.00
007       06-05-2001     25.00        45.00
009       12-05-2001     20.00        20.00
012       02-05-2002     30.00        50.00
015       08-05-2002     50.00        50.00
025       12-05-2002     25.00        75.00
...          ...          ...          ...

Есть предложения?

ОБНОВЛЕНИЕ:

Вот код, который наконец-то сработал благодаря Seb:

#tweak for changing the calendar year to fiscal year
df$year <- as.numeric(format(as.Date(df$giftdate), format="%Y"))
df$month <- as.numeric(format(as.Date(df$giftdate), format="%m"))
df$year <- ifelse(df$month<=6, df$year, df$year+1)

#cum-summing :)
library(plyr)
finalDf <- ddply(df, .(year), summarize, cumsum(as.numeric(as.character(giftamt))))

Ответы [ 3 ]

9 голосов
/ 16 декабря 2011

Я бы попробовал это следующим образом (если это датафрейм):

#tweak for changing the calendar year to fiscal year
df$year <- format(as.Date(df$date), format="%Y")
df$month <- format(as.Date(df$date), format="%m")
df$year <- ifelse(df$month<=6, year, year+1)

#cum-summing :)
library(plyr)
ddply(df, .(year), summarize, cumsum(giftamt))
3 голосов
/ 16 декабря 2011

Есть две задачи: создать столбец в фрейме данных, представляющий каждый год, затем разделить данные, применить совокупность и рекомбинировать.У R есть много способов выполнить обе части.

Вероятно, наиболее читаемый способ донг первой задачи - это year из пакета lubridate.

library(lubridate)
df$year <- year(df$date)

Обратите внимание, что R имеетмного форматов даты, поэтому стоит проверить, используете ли вы в настоящее время POSIXct или Date или chron или zoo или xts или один из других форматов.

Выбор Себаили ddply для второго задания я бы порекомендовал.Для полноты вы также можете использовать tapply или aggregate.

with(df, tapply(giftamt, year, cumsum))
aggregate(giftamt ~ year, df, cumsum)

С новой информацией, которую вы хотите изменить годами 1 июля, обновите столбец года до

df$year <- with(df, year(date) + (month(date) >= 7))
1 голос
/ 21 декабря 2011
gifts <- read.table("gifts.txt", header=T, quote="\"")
NbGifts <- nrow(gifts)

# Determination of the relevant fiscal year ending dates
CalYear <- as.numeric(substr(gifts$date,7,10)) # calendar years
TCY <- as.numeric(names(table(CalYear))) # list of calendar years
MDFY <- "07-01-" # ending date for the current fiscal year
EFY <- paste(MDFY,TCY,sep="") # list of fiscal year ending dates
EFYplus <- cbind(TCY,EFY) # table of fiscal year ending dates
colnames(EFYplus) <- c("CalYear","EndDate")

# Manipulation of data frames in order to match
# the fiscal year end dates to the relevant dates
giftsPlusYear <- data.frame(CalYear, gifts, stringsAsFactors = FALSE)
giftsPlusEFY <- merge(giftsPlusYear,EFYplus) # using the CalYear

# Date comparison in order to associate a gift to its fiscal year
DateGift <- as.Date(giftsPlusEFY$date,"%m-%d-%y") # date conversion for comparison
DateEFY <- as.Date(giftsPlusEFY$EndDate,"%m-%d-%y")
FiscYear <- ifelse(DateGift<DateEFY,giftsPlusEFY$CalYear,giftsPlusEFY$CalYear+1)

# Computation of cumulative totals per fiscal year
LastFY <- 0
CumGift <- rep(0,NbGifts)
for (g in 1:NbGifts){
  if (LastFY==FiscYear[g]){
    CumGift[g] <- CumGift[g-1] + gifts$giftamt[g]
    } else {
      CumGift[g] <- gifts$giftamt[g]
      LastFY <- FiscYear[g]
    }
}
(CumGifts <- cbind(gifts,CumGift))
...