17

我有以下数据框:

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”获得相同的结果?

4

2 回答 2

26

这会有帮助吗?

> data.frame(unclass(table(df)))
  calib first valid
1     1     2     0
2     2     0     2
3     0     0     2
4     1     1     1
于 2012-07-21T10:42:12.507 回答
4

稍微详细说明一下。我已经更改了示例 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
于 2016-06-29T14:59:52.673 回答