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

少しだけ詳しく説明します。ID がテーブルに引き継がれ、行数のシーケンスではないことを証明するために、ID が 1:4 にならないように、例の data.frame の 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 つの方法のいずれかで、新しい 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 に答える