-1

I have a dataframe:

df1
vec1  vec2  vec3  vec4  vec5
0     10    5     12    5
10    20    13    1     7
20    30    28    13    16

And I perform combn() on it:

x = combn( df1[,1:4] , 3 )

Which returns a matrix like this:

x
V1           V2
c(0,10,20)   c(0,10,20)
c(10,20,30)  c(5,13,28)
c(5,13,28)   c(12,1,13)

And I want to obtain a vector where each element going down is the median value of each n in c(n,n+1,n+2) of each column of x. Like this:

y
V1                         V2
5 #(median of 0,10,5)      5 #(median of 0,5,12)
13 #(median of 10,20,13)   10 #(median of 0,5,12)
28 #(median of 20,30,28)   20 #(median of 20,28,13)

So you see it is transformed so that each item going down the vectors in y is the median of each n element in the original combn() vectors of lists.

James H
  • 159
  • 1
  • 8

1 Answers1

2

We can use apply() to apply combn() over the rows, then use the median() function in combn(), transposing the result.

t(apply(df1[1:4], 1, combn, 3, median))
#      [,1] [,2] [,3] [,4]
# [1,]    5   10    5   10
# [2,]   13   10   10   13
# [3,]   28   20   20   28

Data:

df1 <- structure(list(vec1 = c(0L, 10L, 20L), vec2 = c(10L, 20L, 30L
), vec3 = c(5L, 13L, 28L), vec4 = c(12L, 1L, 13L), vec5 = c(5L, 
7L, 16L)), .Names = c("vec1", "vec2", "vec3", "vec4", "vec5"), class = "data.frame", row.names = c(NA, 
-3L))
Rich Scriven
  • 97,041
  • 11
  • 181
  • 245
  • I give Richard's code the nod because it is about 3x faster than Frank's first answer, and I had some trouble implementing Frank's second code, namely, the result it gave was not a matrix but rather a vector. Thank you both. – James H Oct 05 '15 at 21:39