2016-12-16 54 views
0

我只是試圖讓我的頭周圍整理我的數據,我有這樣的問題:如何收集一系列數據列成行

我有數據如下:

ID Tx1 Tx1Date Tx1Details Tx2 Tx2Date Tx2Details Tx3 Tx1Date Tx1Details 
1 14 12/3/14  blabla 1e 12/5/14 morebla r 14/2/14 grrr 
2 23 14/5/16  albalb 342 1/4/5  teeee  s 5/6/17 purrr 

我希望數據是在格式

ID Tx TxDate TxDetails 
1 14 12/3/14 blabla 
1 1e 12/5/14 morebla 
1 r 14/2/14 grrr 
2 23 14/5/16 albalb 
2 342 1/4/5  teeee 
2 s 5/6/17 purrr 

我用

library(tidyr) 
library(dplyr) 
NewData<-mydata %>% gather(key, value, "ID", 2:10) 

,但我不知道如何將列按預期的輸出重命名,看看這是否會工作

+0

在撒旦的名字你是怎麼列名'Tx2Details'和'Tx1Date'在你的數據重複? – Abdou

+0

你介意提供'structure(mydata)'的輸出嗎? –

回答

1

data.table包處理得很好。

library(data.table) 
setDT(df) 
melt(df, measure = list(Tx = grep("^Tx[0-3]$", names(df)), 
         Date = grep("Date", names(df)), 
         Details = grep("Details", names(df))), 
     value.name = c("Tx", "TxDate", "TxDetails")) 

或者更簡潔

melt(df, measure = patterns("^Tx[0-3]$", "Date", "Details"), 
     value.name = c("Tx", "TxDate", "TxDetails")) 
2

你可以爲你的數據幀列名到一個更傳統可分離名,然後使用該基地reshape功能,假設你的初始數據幀看起來像這樣(改最後兩個列名Tx3DateTx3Details否則他們是4列的重複和5):

df 
# ID Tx1 Tx1Date Tx1Details Tx2 Tx2Date Tx2Details Tx3 Tx3Date Tx3Details 
#1 1 14 12/3/14  blabla 1e 12/5/14 morebla r 14/2/14  grrr 
#2 2 23 14/5/16  albalb 342 1/4/5  teeee s 5/6/17  purrr 

names(df) <- gsub("(\\d)(\\w*)", "\\2\\.\\1", names(df)) 

df 
# ID Tx.1 TxDate.1 TxDetails.1 Tx.2 TxDate.2 TxDetails.2 Tx.3 TxDate.3 TxDetails.3 
#1 1 14 12/3/14  blabla 1e 12/5/14  morebla r 14/2/14  grrr 
#2 2 23 14/5/16  albalb 342 1/4/5  teeee s 5/6/17  purrr 

reshape(df, varying = 2:10, idvar = "ID", dir = "long") 

# ID time Tx TxDate TxDetails 
#1.1 1 1 14 12/3/14 blabla 
#2.1 2 1 23 14/5/16 albalb 
#1.2 1 2 1e 12/5/14 morebla 
#2.2 2 2 342 1/4/5  teeee 
#1.3 1 3 r 14/2/14  grrr 
#2.3 2 3 s 5/6/17  purrr 

刪除冗餘time變量,如果你不不需要它。

+1

偉大的代碼!我一直在等待答案......有時我會在'dcast','gather','melt','reshape'之間混淆。看到答案後,事情看起來很容易,但! –