I want to compute monthly summaries from daily data. I want to choose which month to start and how many months to total over. Default could be to start in January and total over 3 months. For the number of rain days the default threshold is 0.85mm. I tried to make a function which sum all months not some of months. I will appreciate any help from you guys. Thanks. Here is the data and the code I used.> dput(head(kitale))structure(list(Year = c(1979L, 1979L, 1979L, 1979L, 1979L, 1979L), Month = c(1L, 1L, 1L, 1L, 1L, 1L), Day = 1:6, Rain = c(0, 0, 0, 0, 0, 0)), .Names = c("Year", "Month", "Day", "Rain"), row.names = c(NA, 6L), class = "data.frame") here is the function: total = function(data, threshold = 0.85){ month_tot=matrix(NA,31,12) rownames(month_tot)=as.character(1979:2009) colnames(month_tot)=c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") raindays=month_tot # loop over months and years to get summary statistics for (mon in 1:12) { rain=data[data[2]==mon,c(1,4)] # rain just for a specific month for (yr in 1979:2009) { month_tot[yr-1978,mon]=sum(rain[rain[,1]==yr,2]) raindays[yr-1978,mon]=sum(rain[rain[,1]==yr,2]>threshold) } } month_tot } Regards, Frederic. Frederic Ntirenganya Maseno University, African Maths Initiative, Kenya. Mobile:(+254)718492836 Email: fredo at aims.ac.za https://sites.google.com/a/aims.ac.za/fredo/ [[alternative HTML version deleted]]
If you want to calculate the number of days having greater than a certain threshold of rain within a range of months, a function like this might serve your needs. raindays <- function(data, monStart=1, monEnd=3, threshold=0.85) { with(data, { selRows <- Month >= monStart & Month <= monEnd & Rain > threshold days <- tapply(selRows, Year, sum) return(days) }) } raindays(kitale) Jean On Tue, Apr 14, 2015 at 2:46 AM, Frederic Ntirenganya <ntfredo at gmail.com> wrote:> I want to compute monthly summaries from daily data. I want to choose which > month to start and how many months to total over. Default could be to > start in January and total over 3 months. For the number of rain days the > default threshold is 0.85mm. > > I tried to make a function which sum all months not some of months. I will > appreciate any help from you guys. Thanks. > Here is the data and the code I used. > > > dput(head(kitale))structure(list(Year = c(1979L, 1979L, 1979L, 1979L, > 1979L, 1979L > ), Month = c(1L, 1L, 1L, 1L, 1L, 1L), Day = 1:6, Rain = c(0, > 0, 0, 0, 0, 0)), .Names = c("Year", "Month", "Day", "Rain"), row.names > c(NA, > 6L), class = "data.frame") > > here is the function: > > total = function(data, threshold = 0.85){ > month_tot=matrix(NA,31,12) > rownames(month_tot)=as.character(1979:2009) > > colnames(month_tot)=c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") > raindays=month_tot > # loop over months and years to get summary statistics > for (mon in 1:12) { > rain=data[data[2]==mon,c(1,4)] # rain just for a specific month > for (yr in 1979:2009) { > month_tot[yr-1978,mon]=sum(rain[rain[,1]==yr,2]) > raindays[yr-1978,mon]=sum(rain[rain[,1]==yr,2]>threshold) > } > } > month_tot > } > > Regards, > > Frederic. > > > > Frederic Ntirenganya > Maseno University, > African Maths Initiative, > Kenya. > Mobile:(+254)718492836 > Email: fredo at aims.ac.za > https://sites.google.com/a/aims.ac.za/fredo/ > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >[[alternative HTML version deleted]]
Hi Jean, Thanks for the help! How can I compute monthly total of rainfall? I want to compute both monthly total of rainfall and number of raindays. In below function month_tot is a table and I want to some month. default is 3 months. The loop for quarter is not working and I am wondering why it is not working. total = function(data, threshold = 0.85){ month_tot=matrix(NA,length(unique(data$Year)),12) rownames(month_tot)=as.character(unique(data$Year)) colnames(month_tot)=c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") raindays=month_tot # loop over months and years to get summary statistics for (mon in 1:12) { rain=data[data[2]==mon,c(1,4)] # rain just for a specific month for (yr in unique(data$Year)) { month_tot[yr-min(unique(data$Year)-1),mon]=sum(rain[rain[,1]==yr,2]) #print(sum(rain[rain[,1]==yr,2])) raindays[yr-min(unique(data$Year)-1),mon]=sum(rain[rain[,1]==yr,2]>threshold) } } month_tot 1:ncol(month_tot) #month_tot[,1] + month_tot[,2] + month_tot[,3] quarter <-c() i = 3 for (i in 1:ncol(month_tot)){ quarter[i] = sum(month_tot[,i]) } quarter } total(kitale) Regards, Frederic. Frederic Ntirenganya Maseno University, African Maths Initiative, Kenya. Mobile:(+254)718492836 Email: fredo at aims.ac.za https://sites.google.com/a/aims.ac.za/fredo/ On Tue, Apr 14, 2015 at 1:52 PM, Adams, Jean <jvadams at usgs.gov> wrote:> If you want to calculate the number of days having greater than a certain > threshold of rain within a range of months, a function like this might > serve your needs. > > raindays <- function(data, monStart=1, monEnd=3, threshold=0.85) { > with(data, { > selRows <- Month >= monStart & Month <= monEnd & Rain > threshold > days <- tapply(selRows, Year, sum) > return(days) > }) > } > > raindays(kitale) > > Jean > > On Tue, Apr 14, 2015 at 2:46 AM, Frederic Ntirenganya <ntfredo at gmail.com> > wrote: > >> I want to compute monthly summaries from daily data. I want to choose >> which >> month to start and how many months to total over. Default could be to >> start in January and total over 3 months. For the number of rain days the >> default threshold is 0.85mm. >> >> I tried to make a function which sum all months not some of months. I will >> appreciate any help from you guys. Thanks. >> Here is the data and the code I used. >> >> > dput(head(kitale))structure(list(Year = c(1979L, 1979L, 1979L, 1979L, >> 1979L, 1979L >> >> ), Month = c(1L, 1L, 1L, 1L, 1L, 1L), Day = 1:6, Rain = c(0, >> 0, 0, 0, 0, 0)), .Names = c("Year", "Month", "Day", "Rain"), row.names >> c(NA, >> 6L), class = "data.frame") >> >> here is the function: >> >> total = function(data, threshold = 0.85){ >> month_tot=matrix(NA,31,12) >> rownames(month_tot)=as.character(1979:2009) >> >> colnames(month_tot)=c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") >> raindays=month_tot >> # loop over months and years to get summary statistics >> for (mon in 1:12) { >> rain=data[data[2]==mon,c(1,4)] # rain just for a specific month >> for (yr in 1979:2009) { >> month_tot[yr-1978,mon]=sum(rain[rain[,1]==yr,2]) >> raindays[yr-1978,mon]=sum(rain[rain[,1]==yr,2]>threshold) >> } >> } >> month_tot >> } >> >> Regards, >> >> Frederic. >> >> >> >> Frederic Ntirenganya >> Maseno University, >> African Maths Initiative, >> Kenya. >> Mobile:(+254)718492836 >> Email: fredo at aims.ac.za >> https://sites.google.com/a/aims.ac.za/fredo/ >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide >> http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. >> > >[[alternative HTML version deleted]]
Don't use html formatted emails and always copy the list on your replies. For example? rainstats <- function(data, months=3) { if (! months %in% c(1, 2, 3, 4, 6, 12)) stop("Months must divide into 12!") period <- 12/months grps <- rep(1:period, each=months) Group <- grps[rainfall$Month] aggregate(Rain~Year+Group, rainfall, function(x) c(sum=sum(x), days=sum(x>0))) }> rainstats(rainfall)Year Group Rain.sum Rain.days 1 1979 1 0 0 ------------------------------------- David L Carlson Department of Anthropology Texas A&M University College Station, TX 77840-4352 From: Frederic Ntirenganya [mailto:ntfredo at gmail.com] Sent: Tuesday, April 14, 2015 9:27 AM To: David L Carlson Subject: Re: [R] Sum of some months totals Hi David, I understand what you did. My aim is to make a function which takes a quarter as a default. i.e I can compute lets say for 4 motnhs by specifying it in the arguments of the function. Regards, Frederic. Frederic Ntirenganya Maseno University, African Maths Initiative, Kenya. Mobile:(+254)718492836 Email:?fredo at aims.ac.za https://sites.google.com/a/aims.ac.za/fredo/ On Tue, Apr 14, 2015 at 4:44 PM, David L Carlson <dcarlson at tamu.edu> wrote: You should read some beginning tutorials for R before you go further. You are wasting a lot of time writing complicated loops that you do not need. R is probably very different from the programming languages you are used to. In these examples I called your data "rainfall." To get the sum of the rain for each month you need only: aggregate(Rain~Year+Month, rainfall, sum) To get the number of days with rain is slightly more complicated: aggregate(Rain~Year+Month, rainfall, function(x) sum(x>0)) To get the sum for a quarter, you need to add quarters to your data frame, eg. Notice that it does not require a loop to add an entire column to your existing data frame. rainfall$Quarter <- (rainfall$Month+2) %/% 3 aggregate(Rain~Year+Quarter, rainfall, sum) The command ?aggregate will bring up a manual page on the aggregate() function. Read "Introduction to R" at http://cran.r-project.org/manuals.html and one or more of the contributed manuals at http://cran.r-project.org/other-docs.html ------------------------------------- David L Carlson Department of Anthropology Texas A&M University College Station, TX 77840-4352 -----Original Message----- From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of Frederic Ntirenganya Sent: Tuesday, April 14, 2015 6:10 AM To: Adams, Jean Cc: r-help at r-project.org Subject: Re: [R] Sum of some months totals Hi Jean, Thanks for the help! How can I compute monthly total of rainfall? I want to compute both monthly total of rainfall and number of raindays. In below function month_tot is a table and I want to some month. default is 3 months. The loop for quarter is not working and I am wondering why it is not working. total = function(data, threshold = 0.85){ ? month_tot=matrix(NA,length(unique(data$Year)),12) ? rownames(month_tot)=as.character(unique(data$Year)) colnames(month_tot)=c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") ? raindays=month_tot ? # loop over months and years to get summary statistics ? for (mon in 1:12) { ? ? rain=data[data[2]==mon,c(1,4)]? ?# rain just for a specific month ? ? for (yr in unique(data$Year)) { ? ? ? month_tot[yr-min(unique(data$Year)-1),mon]=sum(rain[rain[,1]==yr,2]) ? ? ? #print(sum(rain[rain[,1]==yr,2])) raindays[yr-min(unique(data$Year)-1),mon]=sum(rain[rain[,1]==yr,2]>threshold) ? ? } ? } ? month_tot ? 1:ncol(month_tot) ? #month_tot[,1] + month_tot[,2] + month_tot[,3] ? quarter <-c() ? i = 3 ? for (i in 1:ncol(month_tot)){ ? ? quarter[i] = sum(month_tot[,i]) ? } ? quarter } total(kitale) Regards, Frederic. Frederic Ntirenganya Maseno University, African Maths Initiative, Kenya. Mobile:(+254)718492836 Email: fredo at aims.ac.za https://sites.google.com/a/aims.ac.za/fredo/ On Tue, Apr 14, 2015 at 1:52 PM, Adams, Jean <jvadams at usgs.gov> wrote:> If you want to calculate the number of days having greater than a certain > threshold of rain within a range of months, a function like this might > serve your needs. > > raindays <- function(data, monStart=1, monEnd=3, threshold=0.85) { >? ?with(data, { >? ? ?selRows <- Month >= monStart & Month <= monEnd & Rain > threshold >? ? ?days <- tapply(selRows, Year, sum) >? ? ?return(days) >? ?}) > } > > raindays(kitale) > > Jean > > On Tue, Apr 14, 2015 at 2:46 AM, Frederic Ntirenganya <ntfredo at gmail.com> > wrote: > >> I want to compute monthly summaries from daily data. I want to choose >> which >> month to start and how many months to total over.? Default could be to >> start in January and total over 3 months.? For the number of rain days the >> default threshold is 0.85mm. >> >> I tried to make a function which sum all months not some of months. I will >> appreciate any help from you guys. Thanks. >> Here is the data and the code I used. >> >> > dput(head(kitale))structure(list(Year = c(1979L, 1979L, 1979L, 1979L, >> 1979L, 1979L >> >> ), Month = c(1L, 1L, 1L, 1L, 1L, 1L), Day = 1:6, Rain = c(0, >> 0, 0, 0, 0, 0)), .Names = c("Year", "Month", "Day", "Rain"), row.names >> c(NA, >> 6L), class = "data.frame") >> >> here is the function: >> >> total = function(data, threshold = 0.85){ >>? ?month_tot=matrix(NA,31,12) >>? ?rownames(month_tot)=as.character(1979:2009) >> >> colnames(month_tot)=c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") >>? ?raindays=month_tot >>? ?# loop over months and years to get summary statistics >>? ?for (mon in 1:12) { >>? ? ?rain=data[data[2]==mon,c(1,4)]? ?# rain just for a specific month >>? ? ?for (yr in 1979:2009) { >>? ? ? ?month_tot[yr-1978,mon]=sum(rain[rain[,1]==yr,2]) >>? ? ? ?raindays[yr-1978,mon]=sum(rain[rain[,1]==yr,2]>threshold) >>? ? ?} >>? ?} >>? ?month_tot >> } >> >> Regards, >> >> Frederic. >> >> >> >> Frederic Ntirenganya >> Maseno University, >> African Maths Initiative, >> Kenya. >> Mobile:(+254)718492836 >> Email: fredo at aims.ac.za >> https://sites.google.com/a/aims.ac.za/fredo/ >> >>? ? ? ? ?[[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide >> http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. >> > >? ? ? ? [[alternative HTML version deleted]] ______________________________________________ R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.