2013-03-31 42 views
1

這似乎有人誰擁有實踐與reshape包一個明顯的問題,但我試圖讓使用它的功能,我無法找出正確的語法!如何多行重塑一個單行多列

讓我們有以下的數據幀,

df <- data.frame(matrix(1:12,ncol=3),row.names=letters[1:4]) 

    X1 X2 X3 
a 1 5 9 
b 2 6 10 
c 3 7 11 
d 4 8 12 

我們如何可以綁定,以得到以下結果中的行成列?

X1.a X2.a X3.a X1.b X2.b X3.b X1.c X2.c X3.c X1.d X2.d X3.d 
    1 5 9 2 6 10 3 7 11 4 8 12 

謝謝

回答

6

這也將工作:

vec <- c(t(df)) 
names(vec) <- c(outer(colnames(df), rownames(df), paste, sep=".")) 

## > vec 
## X1.a X2.a X3.a X1.b X2.b X3.b X1.c X2.c X3.c X1.d X2.d X3.d 
## 1 5 9 2 6 10 3 7 11 4 8 12 
+0

+1擊敗我。 –

+0

啊...... !!!!當我用'expand.grid'解決問題時,我應該想到'outer'。非常好! (+1)。 – Arun

2

這裏有一個:

m <- melt(cbind(df, rn=rownames(df)), id.vars='rn') 
cast(m, ~ rn + variable) 

## value a_X1 a_X2 a_X3 b_X1 b_X2 b_X3 c_X1 c_X2 c_X3 d_X1 d_X2 d_X3 
## 1 (all) 1 5 9 2 6 10 3 7 11 4 8 12 

或者像阿倫表示,acast給出了一個矩陣(沒有額外的value列):

acast(m, . ~ variable+rn) 
##  X1_a X1_b X1_c X1_d X2_a X2_b X2_c X2_d X3_a X3_b X3_c X3_d 
## [1,] 1 2 3 4 5 6 7 8 9 10 11 12 

(請注意,由於公式被翻轉,排列是以另一種順序排列的。)

+0

我會用'reshape2'用'acast(男,〜變量+ RN)'。 – Arun

+0

可以這麼說,@阿倫。 –

+0

對不起,我不太明白你的意思:)。 – Arun

3

既然你想讓它作爲一個載體,沒有必要爲reshape深灰色。您可以只需unlist它,然後使用setNames來相應地設置名稱。

df.t <- as.data.frame(t(df)) 
vec <- unlist(df.t, use.names=FALSE) # gives a vector not matrix/data.frame 
vec.names <- do.call(paste, c(expand.grid(rownames(df.t), colnames(df.t)), sep=".")) 
vec <- setNames(vec, vec.names) 

# X1.a X2.a X3.a X1.b X2.b X3.b X1.c X2.c X3.c X1.d X2.d X3.d 
# 1 5 9 2 6 10 3 7 11 4 8 12