Search code examples
rreshape2

Sort columns and reshape into one row object


I have some time series variable in my dataframe

        var1    var2       var3
[1,]      23      1         10
[2,]      24      2         11
[3,]      25      3         12
[4,]      26      4         13
[5,]      27      5         14
[6,]      28      6         15

I would like to reshape it all in a line

     var1 (lag0), var1 (lag1), var1 (lag2), ... , var2 (lag0) , var2 (lag1) ...
[1,]      28        27            26        ...       6            5        ...

Solution

  • All you need is to sort every column (in decreasing order) and generate column names.

    Generate dummy data:

    data <- matrix(sample(1:18), 6)
    colnames(data) <- paste0("var", 1:3)
    
         var1 var2 var3
    [1,]    6   18   14
    [2,]   17   12    7
    [3,]   15    1   16
    [4,]   13    5    3
    [5,]   10    8    2
    [6,]    4   11    9
    

    Reshape original data into one row matrix:

    result <- matrix(apply(data, 2, sort, TRUE), 1)
    

    Add column names:

    colnames(result) <- as.vector(sapply(colnames(data), paste0, " (lag", 0:(nrow(data) - 1), ")"))
    

    Final result (result[, 1:10]):

    var1 (lag0) var1 (lag1) var1 (lag2) var1 (lag3) var1 (lag4) var1 (lag5) var2 (lag0) var2 (lag1) var2 (lag2) var2 (lag3) 
             18          15          10           9           6           5          16          14          12           8