2015-09-26 170 views
2

我不能完全得到這個工作。我所擁有的是一大堆類似的數據幀(相同的列),這些數據幀已經被cbind編輯在一起,我現在想要得到一個相當於具有rbind的數據幀。 例如如果如何將綁定的數據幀轉換爲綁定的數據幀?

# with this 
set.seed(117) 
df1 <- as.data.frame(do.call(cbind,rep(mtcars[sample(nrow(mtcars), 5),],3))) 
      mpg cyl disp hp drat wt qsec vs am gear carb mpg cyl disp hp drat wt qsec vs am gear carb mpg cyl disp hp drat wt qsec vs am gear carb 
[1,] 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 
[2,] 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 
[3,] 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 
[4,] 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 
[5,] 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 

# transform it into this something that looks like this 
set.seed(117) 
do.call(rbind,lapply(1:3, function(x) mtcars[sample(nrow(mtcars), 5),])) 
        mpg cyl disp hp drat wt qsec vs am gear carb 
AMC Javelin   15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 
Mazda RX4 Wag  21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 
Merc 450SLC   15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 
Mazda RX4   21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 
Datsun 710   22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 
Merc 450SL   17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 
Ford Pantera L  15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 
Datsun 7101   22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 
Merc 280   19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 
Dodge Challenger1 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 
Merc 450SE   16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 

獎勵積分可以添加它來自哪個數據塊的指示符列指定(即,在我們的例子中,每個組5個的觀察將被由列標記爲1,2或3「套」) 。

謝謝你的幫助。非常感謝。

回答

4

我們可以通過 'DF1',subset的列名split在 'DF1' 列的順序,串聯(c)列,然後轉換爲 'data.frame'

data.frame(lapply(split(1:ncol(df1), colnames(df1)), function(i) c(df1[,i]))) 

注意:data.frame不能有重複的行名稱。

稍微更緊湊的選項是複製列名後的數據集split,用data.frame包裝它以將list轉換爲data.frame

data.frame(split(df1, colnames(df1)[col(df1)])) 

編輯:以上兩種方法都是基於這樣的假設OP的數據集matrix(在OP的帖子編輯之前)。如果初始數據集是data.frame,我們在第一種方法改變cunlist

df2 <- data.frame(lapply(split(1:ncol(df1), colnames(df1)), 
      function(i) unlist(df1[,i], use.names=FALSE))) 

如果我們需要創建一個指示符列指定數據塊中,我們可以基於列名

使用 ave來創建序列
df2$ind <- ave(seq_along(df1), colnames(df1), FUN=seq_along) 
+0

只要df1是一個矩陣就可以工作。有沒有數據框架的方法?多個具有相同名稱的列將以sameName.1,sameName.2,sameName.3等形式返回。 – jks612

+0

@ jks612我認爲您的輸入數據集是「矩陣」。 – akrun

+1

這樣做。謝謝! – jks612