/ / Počet frekvencií v R [duplikát] - r, frekvencia, zmena tvaru

Počet frekvencií v R [duplikát] - r, frekvencia, zmena tvaru

To sa môže javiť ako veľmi základná otázka typu R, ale ocenil by som odpoveď. Mám dátový rámec v podobe:

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

Chcem to transformovať do počtu, takže výsledok by bol taký. Snažil som sa použiť funkciu table (), ale zdá sa, že môžem získať počet iba pre jeden stĺpec.

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

Ako to urobím v R?

odpovede:

9 pre odpoveď č. 1

Nie som si úplne istý, čo si použil, ale table funguje mi dobre!

Tu je minimálny reprodukovateľný príklad:

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

Poznámky:

  • vyskúšať table(df[c(2, 1)]) (alebo table(df$V2, df$V1)) na výmenu riadkov a stĺpcov.
  • použitie as.data.frame.matrix(table(df)) získať data.frame ako váš výstup. (as.data.frame vytvorí dlhý data.frame, ani jeden v rovnakom výstupnom formáte, ako požadujete).

4 pre odpoveď č. 2

Použitím f od @Ananda môžete použiť 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

Píšem to však iba pre prípad, že by ste potrebovali niečo viac než len table (čo je v tomto prípade najjednoduchšia správna odpoveď) v budúcnosti, napríklad:

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