Maura E Monville
2007-Sep-17 18:11 UTC
[R] How can I write routines and scripts in the R environment ?
*I would like to plot some semi-periodic signals as a function of the phase expressed as a value in [0,2PI]* *The problem is that the phase data is reported as the residual of the division by 2PI.* *For instance if the phase is 10.359 rd then:* *15.359 / 6.283185 = 2*6.283185 + 2.79263* *then only the residual 2.79263 is stored. * *In order to plot a number of consecutive cycles I have to add the correct multiple of 2PI to each phase valu.* *The end/beginning of anew cycle is marked in another field, say phase-mark, containing the letter "Z".* *My goal is to write a small routine that does that for each signal file.* *If I had to do that in C language I'd write something like:* ** *num-cycles = 0; for (i=0,i<num-records; i++) {* * if ( my.data.frame$phase_mark[i] =="Z" ) {* * my.data.frame$phase[i] += num-cycles*2PI;* * num-cycles++;* * }* *}* *Questions*: *1. How can I write a small routine like the one above to operate on certain columns of an entire data.frame ?* *2. How can I write a parametric R script (like a shell script in Linux) that reads a CSV file into a new R data.frame ? The commands I now issue manually are as follows:* ** *read.csv("file-name",header=T,skip=9)* *file-name$PatientID = paste(rep("file-name",length(file-name[,1])))* *names(file-names)= c("Amplitude","Phase", ....)* Thank you so much. Maura -- Maura E.M [[alternative HTML version deleted]]
(Ted Harding)
2007-Sep-17 19:09 UTC
[R] How can I write routines and scripts in the R environmen
On 17-Sep-07 18:11:26, Maura E Monville wrote:> I would like to plot some semi-periodic signals as a function > of the phase expressed as a value in [0,2PI] > The problem is that the phase data is reported as the residual > of the division by 2PI. > For instance if the phase is 10.359 rd then: > 15.359 / 6.283185 = 2*6.283185 + 2.79263 > then only the residual 2.79263 is stored. > In order to plot a number of consecutive cycles I have to add > the correct multiple of 2PI to each phase valu. > The end/beginning of anew cycle is marked in another field, > say phase-mark, containing the letter "Z". > My goal is to write a small routine that does that for each > signal file. > If I had to do that in C language I'd write something like: > > num-cycles = 0; > for (i=0,i<num-records; i++) { > if ( my.data.frame$phase_mark[i] =="Z" ) { > my.data.frame$phase[i] += num-cycles*2PI; > num-cycles++; > } > } > > Questions: > > 1. How can I write a small routine like the one above to operate > on certain columns of an entire data.frame ? >One technique for computing what you want is on the following lines. You don't say what is in your variable "phase_mark" (which I'll call "phasemark" to get rid of the "_"), but I'll assume that it is NA unless there is a "Z" there. In that case, consider the following as a hint: phasemark<-c("Z",NA,NA,"Z",NA,NA,NA,NA,"Z",NA,NA,"Z") 1*((!is.na(phasemark)&(phasemark=="Z"))) ## [1] 1 0 0 1 0 0 0 0 1 0 0 1 cumsum((!is.na(phasemark)&(phasemark=="Z"))) - 1 ## [1] 0 0 0 1 1 1 1 1 2 2 2 3 (i.e. the first "Z" marks the first cycle, so you add 0 multiples of 2*pi). So now if you create phaseno <- cumsum((!is.na(phasemark)&(phasemark=="Z"))) - 1 you can simply add 2*pi*phaseno to your variable phase. A for "operating on certain columns", you have basically done this already by using the selector "$", which extracts the named column. You can equally well assign to it, e.g.> 2. How can I write a parametric R script (like a shell script > in Linux) that reads a CSV file into a new R data.frame? > The commands I now issue manually are as follows: > > read.csv("file-name",header=T,skip=9) > file-name$PatientID = paste(rep("file-name",length(file-name[,1]))) > names(file-names)= c("Amplitude","Phase", ....)DON'T use a name like "file-name" for an object in R!! R will read it as though you are trying to subtract something from a variable called "file". Your first line should be like Data <- read.csv("file-name",header=T,skip=9) Your remaining commands are difficult to interpret without more explicit detail of how the data are stored in the file "file-name", so I can't relate my suggested computation above to what you've written. However, suppose that the dataframe Data as read in above has columns Amplitude, Phase, PhaseMark (NOT Phase-Mark!!) then you could create Data$Phase <- Data$Phase + 2*pi*(cumsum((!is.na(Data$PhaseMark)&(Data$PhaseMark=="Z"))) - 1) which would over-write the original Data$Phase, or you can augment Data with a new column Data$PhasePlus by using Data$PhasePlus <- Data$Phase + 2*pi*(cumsum((!is.na(Data$PhaseMark)&(Data$PhaseMark=="Z"))) - 1) which will leave you original Data$Phase untouched, and add an extra column Data$PhasePlus. As for writing a "parametric R script", you could define a function like read.my.file <- function(filename){ Data <- read.csv(file=filename,header=T,skip=9) Data$PhasePlus <- Data$Phase + 2*pi* (cumsum((!is.na(Data$PhaseMark)&(Data$PhaseMark=="Z"))) - 1) [anything else you want to do at read-in time] Data } (or you could include header and skip as parameters as well) and then call it with MyNewData <- read.my.file("my-new-file") Hoping this helps, Ted. -------------------------------------------------------------------- E-Mail: (Ted Harding) <Ted.Harding at manchester.ac.uk> Fax-to-email: +44 (0)870 094 0861 Date: 17-Sep-07 Time: 20:08:47 ------------------------------ XFMail ------------------------------