Skip to content

calculate row median of every three columns for a dataframe

4 messages · aiguo li, Bert Gunter, Jim Lemon

#
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
#
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 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:
#
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:

            
Nope. This was *not* what Bert noted. But what Bert noted may not be at all
what
Aiguo wanted anyway.

-- Bert