2012-07-21 84 views
6

我有以下的數據幀:r保存表()的輸出轉換成一個數據幀

id<-c(1,2,3,4,1,1,2,3,4,4,2,2) 
period<-c("first","calib","valid","valid","calib","first","valid","valid","calib","first","calib","valid") 
df<-data.frame(id,period) 

period 
id calib first valid 
1  1  2  0 
2  2  0  2 
3  0  0  2 
4  1  1  1 

鍵入

table(df) 

結果然而,如果我保存它作爲數據幀'df'

df<-data.frame(table(df)) 

「DF」的格式將像

id period Freq 
1 1 calib 2 
2 2 calib 1 
3 3 calib 1 
4 4 calib 0 
5 1 first 1 
6 2 first 2 
7 3 first 0 
8 4 first 0 
9 1 valid 0 
10 2 valid 0 
11 3 valid 2 
12 4 valid 3 

如何避免這一點,我怎樣才能保存第一原樣輸出到數據幀?

更重要的是有什麼方法可以使用'dcast'來獲得相同的結果嗎?

回答

14

這會幫助嗎?

> data.frame(unclass(table(df))) 
    calib first valid 
1  1  2  0 
2  2  0  2 
3  0  0  2 
4  1  1  1 
+0

它工作的很好!現在感謝 – AliCivil 2012-07-21 12:41:53

+1

另一個問題:如果我想將id列包含在結果數據框中,該怎麼辦? – AliCivil 2012-07-22 02:10:24

1

要詳細說明一下。我已經更改了示例data.frame中的id,以便您的id不是1:4,以便證明id被攜帶到表中並且不是一個行計數序列。

id <- c(10,20,30,40,10,10,20,30,40,40,20,20)  
period <- c("first","calib","valid","valid","calib","first","valid","valid","calib","first","calib","valid") 
df <- data.frame(id,period) 

創建新的data.frame兩種方式之一。 rengis對於ID列爲第一列的2列數據框,答案不錯。如果您的數據框超過2列,或者列的排列順序不同,它將無法很好地工作。

替代方法是指定的列和列以便您的表:

df3 <- data.frame(unclass(table(df$id, df$period))) 

id列包含在新的data.frame作爲row.names(df3)。將其添加爲新列:

df3$id <- row.names(df3) 
df3 
    calib first valid id 
10  1  2  0 10 
20  2  0  2 20 
30  0  0  2 30 
40  1  1  1 40