2017-07-11 75 views
0

我通常在這裏找到貼前面的問題的答案,但我似乎無法找到這個人,所以這是我的處女問題:拆分列合併重複的變量

我有一個數據幀與一列重複值,我想拆分其他列,並且只有1個值在第一列和多列比在原始數據框。

實施例:

df <- data.frame(test = c(rep(1:5,3)), time = sample(1:100,15), score = sample(1:500,15)) 

原始數據幀有3列和15行。

它會變成一個5行的數據框,並將列分成7列:'test','time1','time2','time3','score1',score2','score3' 。

有沒有人有一個想法如何做到這一點?

+0

歡迎堆棧溢出!請參考[tour](https://stackoverflow.com/tour),環顧四周,閱讀[幫助中心](https://stackoverflow.com/help),特別是[我該怎麼問一個好問題?](https://stackoverflow.com/help/how-to-ask)。 請添加您迄今爲止已完成的工作以解決問題,並描述您正在解決的難題 –

+0

盡我所能,但我不知道如何複製/粘貼(所需)輸出到這個問題。感謝您的歡迎,我通讀了幫助中心,如果我的問題低於標準,我很抱歉。我會再讀一遍。 – Ifar

回答

1

我想用dcastrowid從data.table封裝非常適合這項任務:

library(data.table) 
dcast(setDT(df), test ~ rowid(test), value.var = c('time','score'), sep = '') 

結果:

test time1 time2 time3 score1 score2 score3 
1: 1 52  3 29  21 131  45 
2: 2 79 44  6 119  1 186 
3: 3 67 95 39  18 459 121 
4: 4 83 50 40 493 466 497 
5: 5 46 14  4 465  9  24 
+0

非常感謝你,這似乎是個訣竅! – Ifar

0

請試試這個:

df <- data.frame(test = c(rep(1:5,3)), time = sample(1:100,15), score = sample(1:500,15)) 

df$class <- c(rep('a', 5), rep('b', 5), rep('c', 5)) 


df <- split(x = df, f = df$class) 

binded <- cbind(df[[1]], df[[2]], df[[3]]) 

binded <- binded[,-c(5,9)] 


> binded 
    test time score class time.1 score.1 class.1 time.2 score.2 class.2 
1 1 40 404  a  57  409  b  70  32  c 
2 2 5 119  a  32  336  b  93  177  c 
3 3 20 345  a  44  91  b 100  42  c 
4 4 47 468  a  60  265  b  24  478  c 
5 5 16 52  a  38  219  b  3  92  c 

讓我知道它是否適合你!

+1

您可以將此綁定的< - cbind(df [[1]],df [[2]],df [[3]])更改爲'binded = do.call(cbind,df)' – Wen

+0

這是正確的!謝謝你的提示!我認爲我必須更頻繁地使用'do.call'! –

+1

巧妙的解決方案,並感謝回覆如此之快。但是我認爲h3rm4n的解決方案對於這個特定的問題來說更簡潔一些。 – Ifar