将table()函数的输出保存到数据框中

19

I have the following data frame:

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)

打字
table(df) 

导致

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

然而,如果我将其保存为数据框架 '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”获得相同结果的方法?

2个回答

31

这会有帮助吗?

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

4
现在又有一个问题:如果我想要在结果数据框中包含id列怎么办? - AliCivil
你的问题 @AliCivil 的答案是:df$id <- row.names(df) - Sandy

4

稍微解释一下。我已经更改了示例数据框中的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)

创建新的数据框有两种方法。如果你的2列数据框中id列是第一列,那么rengis的答案很好用。但是如果你的数据框有超过2列或者列的顺序不同,那么这种方法可能不太适用。
另一种方法是指定表格的列和列顺序:
df3 <- data.frame(unclass(table(df$id, df$period)))

新的数据框中包含id列,作为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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接