[R] Challenge extracting months

Jim Lemon drjimlemon at gmail.com
Wed Feb 1 00:12:33 CET 2017


Hi Kwesi,
I worked through your code below, and I think that when you have the
two variables "mon.t1" and "seas.t1" you can select a "rolling
quarter" like this:

# the file name in your example is different from the one you sent
era<-read.table(file="SAfr_700hpa_7x5II.txt",header=FALSE,sep=" ",
 skip=1,dec = ".")
era.nodes<-paste(era[,1],era[,2],sep=".")
era.nodes<-as.numeric(era.nodes)
era.nodes.days<-zooreg(era.nodes,start=as.Date("1980-01-01"),
 end=as.Date("2016-12-31"))
era.nodes.days.t1<-window(era.nodes.days,start=as.Date("1980-01-01"),
 end=as.Date("2016-12-31"))
mon.t1<-as.numeric(format(index(era.nodes.days.t1),"%m"))
addyear<-0
# this loop transforms mon.t1 into an increasing sequence of months
for(i in 2:length(mon.t1)) {
 if(seas.t1[i] > seas.t1[i-1]) addyear<-addyear+12
 mon.t1[i]<-mon.t1[i] + addyear
}
for(i in 1:(max(mon.t1)-2)) {
 # this gives a logical index for the rolling quarter
 rq<-mon.t1 %in% i:(i+2)
}

Each successive "rq" produced by the last loop can be used to extract
whatever values you want from "era" or "era.nodes".

Jim


On Tue, Jan 31, 2017 at 9:04 PM, Kwesi Quagraine <starskykwesi at gmail.com> wrote:
> Hello Jim, thanks for the code. But I come to you once again, I am not
> looking to do a rolling mean, but to select JFM,FMA,MAM etc from the data
> attached. Below is my sample code which actually selects these months. I
> will rather be glad if I can have a function that does the selection for all
> these 3 months selected for each year as shown in my last two lines of code;
> Taking into accounts years with 29 days in February etc.
>
> rm(list = ls())
> library(zoo)
> library(PCICt)
> library(lattice)
> library(RColorBrewer)
>
> setwd('/home/kwesi/Documents/700hpa/soms/')
> # Reading the data
>
> era       <- read.table(file="SAfr_700hpa_5x4II.txt",header = FALSE, sep =
> "",skip=1,dec = ".")
> era.nodes      <- paste(era[,1],era[,2],sep=".")
>
> era.nodes      <-as.numeric(era.nodes)
> era.nodes.days<-zooreg(era.nodes,start=as.Date("1980-01-01"),end=as.Date("2016-12-31"))
>
> era.nodes.days.t1<-window(era.nodes.days,start=as.Date("1980-01-01"),end=as.Date("2016-12-31"))
>
> mon.t1<-as.numeric(format(index(era.nodes.days.t1),"%m"))
> seas.t1 <-as.numeric(format(index(era.nodes.days.t1),"%Y"))
> era.nodes.days.t1<-cbind(era.nodes.days.t1,mon.t1,seas.t1)
> era.nodes.days.t1
> jfm80<-era.nodes.days.t1[1:91,1:3[era.nodes.days.t1[1:91,2]==1|era.nodes.days.t1[1:91,2]==2|era.nodes.days.t1[1:91,2]==3]
> fma80<-era.nodes.days.t1[32:(91+30),1:3
> [era.nodes.days.t1[1:91,2]==2|era.nodes.days.t1[1:91,2]==3|era.nodes.days.t1[1:91,2]==4]
>
> On Tue, Jan 31, 2017 at 5:23 AM, Jim Lemon <drjimlemon at gmail.com> wrote:
>>
>> Hi Kwesi,
>> A mistake in the last email. Don't try to replace the column in
>> era.sta as the result will be a different length. Try this:
>>
>> newera.sta2<-collapse.values(era.sta[,2],3)
>>
>> Jim
>>
>> On Tue, Jan 31, 2017 at 10:32 AM, Jim Lemon <drjimlemon at gmail.com> wrote:
>> > Hi Kwesi,
>> > The function collapse_values will only work on a vector of numbers
>> > with FUN="mean". era.sta looks like a data frame with at least two
>> > elements. As the second of these elements seems to be numeric, perhaps
>> > this will work:
>> >
>> > era.sta[,2]<-collapse.values(era.sta[,2],3)
>> >
>> > Don't try to apply the names to era.sta, that was just something to
>> > make the example easier to understand. If you want to collapse more
>> > than one column of era.sta do each one at a time and assign them to a
>> > new data frame. In particular, if era[,1] is a vector of month names,
>> > you will have to create a new vector of quarter (three month) names.
>> > If there are very many of these, the collapse_values function can be
>> > modified to do it automatically.
>> >
>> > Jim
>> >
>> >
>> >
>> > On Tue, Jan 31, 2017 at 9:50 AM, Kwesi Quagraine
>> > <starskykwesi at gmail.com> wrote:
>> >> Hello Jim,this is my script now; I am having this error when I called
>> >> the
>> >> function;" In mean.default(list(era...1. = 1:444, Node_freq =
>> >> c(-0.389855332400718,  :  argument is not numeric or logical: returning
>> >> NA"
>> >> Any help will be much appreciated.
>> >>
>> >> Kwesi
>> >>
>> >> rm(list = ls())
>> >> setwd('/home/kwesi/Documents/700hpa/soms/')
>> >> # Reading the data
>> >>
>> >> era       <- read.csv(file="som_freq.csv",header = TRUE, sep = ",",dec
>> >> =
>> >> ".")
>> >> era.scaled <- scale(era[,2:3], center = TRUE, scale = TRUE)
>> >> era.sta<-data.frame(era[,1],era.scaled)
>> >> era.sta
>> >>
>> >> collapse_values<-function(x,span,FUN="mean",na.rm=FALSE) {
>> >>   jump<-span-1
>> >>   newx<-rep(NA,length(x)-jump)
>> >>   for(i in 1:length(newx))
>> >>     newx[i]<-do.call(FUN,list(x[i:(i+jump)],na.rm=na.rm))
>> >>   return(newx)
>> >> }
>> >>
>> >> #test<-1:12
>> >> names(era.sta)<-month.abb
>> >> collapse_values(era.sta,3)
>> >> era.sta
>> >>
>> >>
>> >> On Mon, Jan 30, 2017 at 11:53 PM, Jim Lemon <drjimlemon at gmail.com>
>> >> wrote:
>> >>>
>> >>> Hi Kwesi,
>> >>> Even without the data, it seems clear that you want something like a
>> >>> rolling mean. Here is a simple function that will apply a function
>> >>> like "mean" to successive bits of a vector of numbers:
>> >>>
>> >>> collapse_values<-function(x,span,FUN="mean",na.rm=FALSE) {
>> >>>  jump<-span-1
>> >>>  newx<-rep(NA,length(x)-jump)
>> >>>  for(i in 1:length(newx))
>> >>>   newx[i]<-do.call(FUN,list(x[i:(i+jump)],na.rm=na.rm))
>> >>>  return(newx)
>> >>> }
>> >>>
>> >>> test<-1:12
>> >>> names(test)<-month.abb
>> >>> test
>> >>> collapse_values(test,3)
>> >>>  [1]  2  3  4  5  6  7  8  9 10 11
>> >>>
>> >>> Jim
>> >>>
>> >>>
>> >>>
>> >>> On Mon, Jan 30, 2017 at 11:53 PM, Kwesi Quagraine
>> >>> <starskykwesi at gmail.com> wrote:
>> >>> > Hello, I have a data with two variables nodes and index, I want to
>> >>> > extract
>> >>> > 3 months seasons, with a shift of 1 month, that is, DJF, JFM, FMA
>> >>> > etc to
>> >>> > OND. Was wondering how to go about it. Kindly find attached the data
>> >>> > as
>> >>> > csv.
>> >>> > Any help will be appreciated.
>> >>> >
>> >>> > Regards,
>> >>> > Kwesi
>> >>> >
>> >>> > --
>> >>> > Try not to become a man of success but rather a man of value-Albert
>> >>> > Einstein
>> >>> >
>> >>> > University of Cape Coast|College of Agriculture and Natural
>> >>> > Sciences|Department
>> >>> > of Physics|
>> >>> > Team Leader|Recycle Up! Ghana|Technology Without Borders|
>> >>> > Other emails: kwesi.quagraine at ucc.edu.gh|kwesi.quagraine at teog.de|
>> >>> > Mobile: +233266173582
>> >>> > Skype: quagraine_cwasi
>> >>> > Twitter: @Pkdilly
>> >>> > ______________________________________________
>> >>> > 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.
>> >>
>> >>
>> >>
>> >>
>> >> --
>> >> Try not to become a man of success but rather a man of value-Albert
>> >> Einstein
>> >>
>> >> University of Cape Coast|College of Agriculture and Natural
>> >> Sciences|Department of Physics|
>> >> Team Leader|Recycle Up! Ghana|Technology Without Borders|
>> >> Other emails: kwesi.quagraine at ucc.edu.gh|kwesi.quagraine at teog.de|
>> >> Mobile: +233266173582
>> >> Skype: quagraine_cwasi
>> >> Twitter: @Pkdilly
>> >>
>
>
>
>
> --
> Try not to become a man of success but rather a man of value-Albert Einstein
>
> University of Cape Coast|College of Agriculture and Natural
> Sciences|Department of Physics|
> Team Leader|Recycle Up! Ghana|Technology Without Borders|
> Other emails: kwesi.quagraine at ucc.edu.gh|kwesi.quagraine at teog.de|
> Mobile: +233266173582
> Skype: quagraine_cwasi
> Twitter: @Pkdilly
>



More information about the R-help mailing list