8

これは非常に基本的な R の質問のように思えるかもしれませんが、回答をいただければ幸いです。次の形式のデータフレームがあります。

col1    col2
a   g
a   h
a   g
b   i
b   g
b   h
c   i

カウントに変換したいので、結果はこのようになります。table() 関数を使ってみましたが、1 列のカウントしか取得できないようです。

    a   b   c
g   2   1   0
h   1   1   0
i   0   1   1

Rでどのように行うのですか?

4

2 に答える 2

9

あなたが何を使用したかはよくわかりませんがtable、私にとってはうまくいきます!

最小限の再現可能な例を次に示します。

df <- structure(list(V1 = c("a", "a", "a", "b", "b", "b", "c"), 
                     V2 = c("g", "h", "g", "i", "g", "h", "i")), 
                .Names = c("V1", "V2"), class = "data.frame", 
                row.names = c(NA, -7L))
table(df)
#    V2
# V1  g h i
#   a 2 1 0
#   b 1 1 1
#   c 0 0 1

ノート:

  • table(df[c(2, 1)])(またはtable(df$V2, df$V1)) 行と列を交換してみてください。
  • as.data.frame.matrix(table(df))出力としてa を取得するために使用しdata.frameます。(希望する同じ出力形式ではなくas.data.frame、 long を作成します)。data.frame
于 2013-09-19T12:52:01.303 に答える
4

@Anandafから使用すると、使用できますdcast

library(reshape2)

> dcast(f, V1~V2)
Using V2 as value column: use value.var to override.
Aggregation function missing: defaulting to length
  V1  g  h  i
1 a   2  1  0
2 b   1  1  1
3 c   0  0  1

tableただし、これは、将来、次のようなもの (この場合は最も単純な正解)以上のものが必要になる可能性がある場合にのみ書いています。

set.seed(1)
f$var <- rnorm(7)

> f
  V1 V2        var
1 a   g -0.6264538
2 a   h  0.1836433
3 a   g -0.8356286
4 b   i  1.5952808
5 b   g  0.3295078
6 b   h -0.8204684
7 c   i  0.4874291

> dcast(f, V1~V2, value.var="var", fun.aggregate=sum)
  V1          g          h         i
1 a  -1.4620824  0.1836433 0.0000000
2 b   0.3295078 -0.8204684 1.5952808
3 c   0.0000000  0.0000000 0.4874291
于 2013-09-19T13:00:02.547 に答える