2017-02-28 88 views
0

我試圖將一些數據從長格式重塑爲單行寬格式,下面是我的數據當前的樣子;將長格式數據重塑爲一行寬格式數據

id var1 var2 var3 
1  a b c 
2  d e f 
3  g h i 

下面是我希望我的數據看到最後;

id.1 var1.1 var2.1 var3.1 id.2 var1.2 var2.2 var3.2 id.3 var1.3 var2.3 var3.3 
1   a  b  c 2  d  e  f 3  g  h  i 

我使用tidyr包和reshape嘗試,但既不似乎能夠是我想做的事情。任何幫助將不勝感激。

+0

我認爲只是'unlist(df)'做了你想做的事情(假設你沒有任何因素,而且你不關心訂單)。或'c(t(df))'將給出所需順序的值,但沒有名稱。 –

+0

或者,我想'do.call(cbind,split(mydf,1:nrow(mydf)))',但是*爲什麼*? – A5C1D2H2I1M1N2O1R2T1

回答

1

如果維護列類型是有意義的,您可以嘗試do.call(cbind, split(mydf, 1:nrow(mydf)))

例子:

mydf <- structure(list(id = 1:3, var1 = structure(1:3, .Label = c("a",  
     "d", "g"), class = "factor"), var2 = c("b", "e", "h"), var3 = c("c",  
     "f", "i")), .Names = c("id", "var1", "var2", "var3"), row.names = c(NA, 
     3L), class = "data.frame") 

^^這就好比你的數據,但 「VAR1」 列是一個因素。

do.call(cbind, split(mydf, 1:nrow(mydf))) 
# 1.id 1.var1 1.var2 1.var3 2.id 2.var1 2.var2 2.var3 3.id 3.var1 3.var2 3.var3 
# 1 1  a  b  c 2  d  e  f 3  g  h  i 

str(.Last.value) 
# 'data.frame': 1 obs. of 12 variables: 
# $ 1.id : int 1 
# $ 1.var1: Factor w/ 3 levels "a","d","g": 1 
# $ 1.var2: chr "b" 
# $ 1.var3: chr "c" 
# $ 2.id : int 2 
# $ 2.var1: Factor w/ 3 levels "a","d","g": 2 
# $ 2.var2: chr "e" 
# $ 2.var3: chr "f" 
# $ 3.id : int 3 
# $ 3.var1: Factor w/ 3 levels "a","d","g": 3 
# $ 3.var2: chr "h" 
# $ 3.var3: chr "i" 

^^請注意,列類是保留的。

有點gsub可以得到列名是你所期待的。


或者,您可以從1數據集中添加兩個附加列,一個充滿值爲「1」,其他同序列的行數,並使用它作爲你的「ID」( LHS)和「時間」(RHS)變量與reshape函數或data.table版本的dcast接受多個變量value.var

相關問題