aiguo li
2020-Apr-15 21:27 UTC
[R] calculate row median of every three columns for a dataframe
Hi all, I need to calculate a row median for every three columns of a dataframe.? I made it work using the following script, but not happy with the script.? Is there a simpler way for doing this? df = data.frame("a"=c(2,3,4), "b"=c(3,5,1),"c"=c(1,3,6),"d"=c(7,2,1),"e"=c(2,5,3),"f"=c(4,5,1))tmed <- function(dt) {x = apply(dt,1,median); return(x)}n =seq(1, ncol(df),3)w=0;for (i in n) {?? m=i+2;? dt = df[,i:m];? ?y=tmed(dt);?? ?w = cbind(w,y)}t.med <- w[,2:3] Thanks, Anna [[alternative HTML version deleted]]
Bert Gunter
2020-Apr-16 14:47 UTC
[R] calculate row median of every three columns for a dataframe
You have *not* calculated row medians for all combinations of (is that what you meant?) 3 columns of your data frame. ?combn with column indexing can help you do that. If that is not what you meant, then ?? Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Thu, Apr 16, 2020 at 7:32 AM aiguo li via R-help <r-help at r-project.org> wrote:> > Hi all, > I need to calculate a row median for every three columns of a dataframe. I made it work using the following script, but not happy with the script. Is there a simpler way for doing this? > df = data.frame("a"=c(2,3,4), "b"=c(3,5,1),"c"=c(1,3,6),"d"=c(7,2,1),"e"=c(2,5,3),"f"=c(4,5,1))tmed <- function(dt) {x = apply(dt,1,median); return(x)}n =seq(1, ncol(df),3)w=0;for (i in n) { m=i+2; dt = df[,i:m]; y=tmed(dt); w = cbind(w,y)}t.med <- w[,2:3] > Thanks, > Anna > > > [[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.
Jim Lemon
2020-Apr-17 00:28 UTC
[R] calculate row median of every three columns for a dataframe
Hi Anna, I can't think of a simple way, but this function may make you happier: step_median<-function(x,window) { x<-unlist(x) stop<-length(x)-window+1 xout<-NA nindx<-1 for(i in seq(1,stop,by=window)) { xout[nindx]<-do.call("median",list(x[i:(i+window-1)])) nindx<-nindx+1 } return(xout) } apply(df,1,step_median,3) This should return a matrix where the columns are the medians calculated from blocks of "window" width on each row of "df". As Bert noted, you may want to think about a "rolling" median where the "windows" overlap. This can be done like so: library(zoo) apply(df,1,rollmedian,3) Jim On Fri, Apr 17, 2020 at 12:32 AM aiguo li via R-help <r-help at r-project.org> wrote:> > Hi all, > I need to calculate a row median for every three columns of a dataframe. I made it work using the following script, but not happy with the script. Is there a simpler way for doing this? > df = data.frame("a"=c(2,3,4), "b"=c(3,5,1),"c"=c(1,3,6),"d"=c(7,2,1),"e"=c(2,5,3),"f"=c(4,5,1))tmed <- function(dt) {x = apply(dt,1,median); return(x)}n =seq(1, ncol(df),3)w=0;for (i in n) { m=i+2; dt = df[,i:m]; y=tmed(dt); w = cbind(w,y)}t.med <- w[,2:3] > Thanks, > Anna > > > [[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.
Bert Gunter
2020-Apr-17 01:04 UTC
[R] calculate row median of every three columns for a dataframe
Inline. Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Thu, Apr 16, 2020 at 5:28 PM Jim Lemon <drjimlemon at gmail.com> wrote:> Hi Anna, > I can't think of a simple way, but this function may make you happier: > > step_median<-function(x,window) { > x<-unlist(x) > stop<-length(x)-window+1 > xout<-NA > nindx<-1 > for(i in seq(1,stop,by=window)) { > xout[nindx]<-do.call("median",list(x[i:(i+window-1)])) > nindx<-nindx+1 > } > return(xout) > } > apply(df,1,step_median,3) > > This should return a matrix where the columns are the medians > calculated from blocks of "window" width on each row of "df". As Bert > noted,Nope. This was *not* what Bert noted. But what Bert noted may not be at all what Aiguo wanted anyway. -- Bert> you may want to think about a "rolling" median where the > "windows" overlap. This can be done like so: > > library(zoo) > apply(df,1,rollmedian,3) > > Jim > > On Fri, Apr 17, 2020 at 12:32 AM aiguo li via R-help > <r-help at r-project.org> wrote: > > > > Hi all, > > I need to calculate a row median for every three columns of a > dataframe. I made it work using the following script, but not happy with > the script. Is there a simpler way for doing this? > > df = data.frame("a"=c(2,3,4), > "b"=c(3,5,1),"c"=c(1,3,6),"d"=c(7,2,1),"e"=c(2,5,3),"f"=c(4,5,1))tmed <- > function(dt) {x = apply(dt,1,median); return(x)}n =seq(1, > ncol(df),3)w=0;for (i in n) { m=i+2; dt = df[,i:m]; y=tmed(dt); w > cbind(w,y)}t.med <- w[,2:3] > > Thanks, > > Anna > > > > > > [[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. > > ______________________________________________ > 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]]