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ď č. 1Nie 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)])
(alebotable(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