我有以下数据框:
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'获得相同的结果?
答案 0 :(得分:20)
这会有帮助吗?
> data.frame(unclass(table(df)))
calib first valid
1 1 2 0
2 2 0 2
3 0 0 2
4 1 1 1
答案 1 :(得分:2)
详细说明一下。我已经更改了示例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