2014-02-12 59 views
2

我正面臨一個數據框的重塑問題。它有更多的行和列。簡化的,它的結構是這樣的:重塑一個數據框R

rownames year x1 x2 x3 
a   2000 2 6 11 
b   2000 0 4 2 
c   2000 0 3 5 
a   2010 2 6 11 
b   2010 0 0 0 
c   2020 4 1 8 
a   2020 10 1 7 
b   2020 8 4 10 
c   2020 22 1 16 

我想拿出具有用於變量「年」一個單列一個數據幀,在後續列複製X1,X2,X3的值,並重新命名在rowname和x變量之間組合的列。它應該是這樣的:

year a_x1 a_x2 a_x3 b_x1 b_x2 b_x3 c_x1 c_x2 c_x3 
2000 2  6  11 0  4  2  0  3  5 
2010 2  6  11 0  0  0  4  1  8 
2020 10 1  7  8  4  10 22 1  16 

我想用後續cbind()返回的功能,但因爲我必須這樣做,對數千行和數百列,我希望有一個與重塑包更直接的方式(我對此不太熟悉)

在此先感謝!

+0

請使用'dput(SAMPLE_DATA)'這樣用戶就可以申請自己的建議,你正在尋找相同的數據。 –

+0

你想如何處理重複值?或者我應該假設這是基於您的示例輸出的錯誤? – A5C1D2H2I1M1N2O1R2T1

+0

@HansRoggeman在這種情況下是100%可重複的:'dt < - read.table(text =「...」,header = TRUE)'',只需將複製的文本替換爲'...'。 – Beasterfield

回答

4

首先,我希望rownamesdata.frame列,而不是data.frame的rownames。否則,由於值的非唯一性,您會遇到問題。

我認爲你的主要問題是,你的data.frame不完全熔融:

library(reshape2) 

dt <- melt(dt, id.vars=c("year", "rownames")) 
head(dt) 
    year rownames variable value 
1 2000  a  x1  2 
2 2000  b  x1  0 
3 2000  c  x1  0 
4 2010  a  x1  2 
... 

dcast(dt, year ~ rownames + variable) 
    year a_x1 a_x2 a_x3 b_x1 b_x2 b_x3 c_x1 c_x2 c_x3 
1 2000 2 6 11 0 4 2 0 3 5 
2 2010 2 6 11 0 0 0 4 1 8 
3 2020 10 1 7 8 4 10 22 1 16 

編輯:

由於@spdickson所指出的,也有在你的數據錯誤避免簡單的聚合。當然,year,rowname的組合必須是唯一的。否則,您需要一個聚合函數來確定非唯一組合的結果值。所以我們假設你的數據中的第6行應該是c 2010 4 1 8

+0

毆打我15秒... +1 – A5C1D2H2I1M1N2O1R2T1

+0

他的示例數據集中的錯誤使得dcast()使用長度聚合了結果。如果將第一個「2020」更改爲「2010」,那麼應該修復它以便獲得他想要的結果。 –

+0

@spdickson我沒有意識到,但很好的一點! – Beasterfield

3

您可以嘗試使用reshape()從基礎R,而無需進一步融化你的數據框:

df1 <- read.table(text="rownames year x1 x2 x3 
a   2000 2 6 11 
b   2000 0 4 2 
c   2000 0 3 5 
a   2010 2 6 11 
b   2010 0 0 0 
c   2010 4 1 8 
a   2020 10 1 7 
b   2020 8 4 10 
c   2020 22 1 16",header=T,as.is=T) 

reshape(df1,direction="wide",idvar="year",timevar="rownames") 
# year x1.a x2.a x3.a x1.b x2.b x3.b x1.c x2.c x3.c 
# 1 2000 2 6 11 0 4 2 0 3 5 
# 4 2010 2 6 11 0 0 0 4 1 8 
# 7 2020 10 1 7 8 4 10 22 1 16