Skip to content

Challenge extracting months

8 messages · David Winsemius, Jim Lemon, Kwesi Quagraine

#
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?
#
When you desired for csv files to be distributed to the list you need to rename the file so it has a txt extension. Then you mail client will lable in a manner that the mailserver recognizes as MIME-text.
#
Well noted David. Thanks

Kwesi

On Mon, Jan 30, 2017 at 5:52 PM, David Winsemius <dwinsemius at comcast.net>
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 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,
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:
#
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:
#
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: