Как мога да преброя честотата на низ от друга стойност на колона в рамка с данни R

Опростяване на рамката от данни, с която работя, е:

> df1
         Any              nomMun
   1     2010             CADAQUES
   2     2011             CADAQUES
   3     2012             CADAQUES
   4     2010             BEGUR
   5     2011             BEGUR
   6     2012             BEGUR

Четох някаква публикация и открих, че библиотеката count of plyr връща рамка с данни с низовете и нейната честота. Но искам честотата по години. Крайният резултат, който искам да получа, е рамка от данни като:

> df2
         nomMun       freq_2010     freq_2011     freq_2012
   1     CADAQUES         1             1             1
   2     BEGUR            1             1             1

Може ли някой да ми помогне?

Съжалявам, ако обяснението ми е лошо... аз не съм роден език и за първи път питам тук...


person Marc Coll    schedule 01.05.2018    source източник


Отговори (3)


В data.table просто използвайте .N:

setDT(df1)
df1[, .N, .(nomMun, Any)]

Това ще ви даде данните в дълъг формат. С други думи, ще изглежда така:

Any      nomMum      N
2010     CADAQUES    1
2011     CADAQUES    1
2012     CADAQUES    1
2010     BEGUR       1
2011     BEGUR       1
2012     BEGUR       1

Но тогава можете да го предавате dcast, ако желаете:

dcast(df1[, .N, .(nomMun, Any)], nomMum ~ Any, value.var = "N")
person bk18    schedule 01.05.2018

Изглежда глупаво да се зарежда пакет, когато base R включва функцията table.

> table(df1)
      nomMun
Any    BEGUR CADAQUES
  2010     1        1
  2011     1        1
  2012     1        1
person Brian Davis    schedule 01.05.2018

tidyr::spread може да се използва за получаване на желания резултат:

library(tidyverse)
df1 %>% 
  group_by(nomMun, Any) %>%
  mutate(freq = n()) %>%
  spread(Any, freq)

# # A tibble: 2 x 4
# # Groups: nomMun [2]
#    nomMun   `2010` `2011` `2012`
# *  <chr>     <int>  <int>  <int>
# 1 BEGUR         1      1      1
# 2 CADAQUES      1      1      1
person MKR    schedule 01.05.2018