2017-02-15 20 views
1

我有2列的數據幀:變換一個數據幀使用第一列的值作爲列名

.id vals 
1 A 10 
2 B 20 
3 C 30 
4 A 100 
5 B 200 
6 C 300 

dput(tst_df) 
structure(list(.id = structure(c(1L, 2L, 3L, 1L, 2L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), vals = c(10, 20, 30, 100, 200, 
300)), .Names = c(".id", "vals"), row.names = c(NA, -6L), class = "data.frame") 

現在我想有.id列,成爲我的列名,丘壑將成爲2行。

像這樣:

A B C 
10 20 30 
100 200 300 

基本上.ID是我的分組變量,我想將所有的值屬於1組作爲行。我期望一些簡單的東西如融化和變換。但經過多次嘗試,我仍然沒有成功。有沒有人熟悉將實現這一目標的功能?

回答

2

可以在基R 2與unstack做到這一點:

unstack(df, form=vals~.id) 
    A B C 
1 10 20 30 
2 100 200 300 

第一個參數是所述data.frame的名稱和所述第二是決定取消堆棧結構的公式。

+0

@Imo在這個例子中它的工作原理的確,如果我做我的大DF它創建一個列表。任何想法如何發生? –

+0

這意味着您沒有相同數量的每個級別的觀察值(.id)。如果data.frame結構很重要,那麼在執行'unstack'之前,您可以檢測,創建和「綁定」缺失的行。 – lmo

+1

@Imo謝謝你的提示!它似乎工作後,我刪除了缺少的意見 –

2

您還可以使用tapply

do.call(cbind, tapply(df$vals, df$.id, I)) 
#  A B C 
#[1,] 10 20 30 
#[2,] 100 200 300 

或數據幀包起來,即

as.data.frame(do.call(cbind, tapply(df$vals, df$.id, I))) 
相關問題