2012-07-21 51 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