2016-08-01 122 views
1

矩陣我有5列c1c2c3c4c5數據幀df1創建從數據幀

df1 <- data.frame(c1 = c(1, 0, 1), c2 = c(0, 0, 1), c3 = c(2, 1, 0), c4 = c(1, 4, 3), c5 = c(1, 0, 0)) 

    #df1 
    c1 c2 c3 c4 c5 
    1 0 2 1 1 
    0 0 1 4 0 
    1 1 0 3 0 

我的期望的輸出是:

1 3 3 4 5 
    3 4 4 4 4 
    1 2 4 4 4 

基本上,我基於列號和它的值創建矩陣(值總是小於或等於5)。例如,df1中的第二行具有14屬於列c3c4。因此,所需矩陣中的第二行將是3 4 4 4 4

我自己試了一下。我的代碼涉及幾個嵌套的控制流,對於大型數據框不適用。

回答

2

apply魔術:

t(apply(df, 1, function(x) rep(row(as.matrix(x)), x))) 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 1 3 3 4 5 
#[2,] 3 4 4 4 4 
#[3,] 1 2 4 4 4 
1

這裏有一個稍微不同的選項

t(apply(df1, 1, FUN = function(x) rep(which(x!=0), x[x!=0]))) 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 1 3 3 4 5 
#[2,] 3 4 4 4 4 
#[3,] 1 2 4 4 4