tel het aantal rijen in een dataframe in R op basis van groep

Ik heb een dataframe in Rzoals dit:

 ID   MONTH-YEAR   VALUE
  110   JAN. 2012     1000
  111   JAN. 2012     2000
         .         .
         .         .
  121   FEB. 2012     3000
  131   FEB. 2012     4000
         .           .
         .           .

Dus voor elke maand van elk jaar zijn er nrijen en ze kunnen in elke volgorde staan (wat betekent dat ze niet allemaal in continuïteit zijn en pauzes hebben). Ik wil berekenen hoeveel rijen er zijn voor elk MONTH-YEAR, d.w.z. hoeveel rijen er zijn voor JAN. 2012, hoeveel voor FEB. 2012 enzovoort. Zoiets als dit:

MONTH-YEAR   NUMBER OF ROWS
 JAN. 2012     10
 FEB. 2012     13
 MAR. 2012     6
 APR. 2012     9

Ik heb geprobeerd dit te doen:

n_row <- nrow(dat1_frame %.% group_by(MONTH-YEAR))

maar het levert niet de gewenste output op. Hoe kan ik dat doen?


Antwoord 1, autoriteit 100%

Hier is een voorbeeld dat laat zien hoe table(.)(of, beter overeenkomend met de gewenste uitvoer, data.frame(table(.))doet wat het klinkt zoals je vraagt.

Let ook op hoe u reproduceerbare voorbeeldgegevens kunt delen op een manier die anderen kunnen kopiëren en plakken in hun sessie.

Dit zijn de (reproduceerbare) voorbeeldgegevens:

mydf <- structure(list(ID = c(110L, 111L, 121L, 131L, 141L), 
                       MONTH.YEAR = c("JAN. 2012", "JAN. 2012", 
                                      "FEB. 2012", "FEB. 2012", 
                                      "MAR. 2012"), 
                       VALUE = c(1000L, 2000L, 3000L, 4000L, 5000L)), 
                  .Names = c("ID", "MONTH.YEAR", "VALUE"), 
                  class = "data.frame", row.names = c(NA, -5L))
mydf
#    ID MONTH.YEAR VALUE
# 1 110  JAN. 2012  1000
# 2 111  JAN. 2012  2000
# 3 121  FEB. 2012  3000
# 4 131  FEB. 2012  4000
# 5 141  MAR. 2012  5000

Hier is de berekening van het aantal rijen per groep, in twee outputweergaveformaten:

table(mydf$MONTH.YEAR)
# 
# FEB. 2012 JAN. 2012 MAR. 2012 
#         2         2         1
data.frame(table(mydf$MONTH.YEAR))
#        Var1 Freq
# 1 FEB. 2012    2
# 2 JAN. 2012    2
# 3 MAR. 2012    1

Antwoord 2, autoriteit 96%

De functie count()in plyrdoet wat je wilt:

library(plyr)
count(mydf, "MONTH-YEAR")

Antwoord 3, autoriteit 39%

Aan de hand van de voorbeelddataset die Ananda heeft verzonnen, is hier een voorbeeld met aggregate(), dat deel uitmaakt van core R. aggregate()heeft alleen iets nodig om te tellen als functie van de verschillende waarden van MONTH-YEAR. In dit geval heb ik VALUEgebruikt om te tellen:

aggregate(cbind(count = VALUE) ~ MONTH.YEAR, 
          data = mydf, 
          FUN = function(x){NROW(x)})

waardoor je…

 MONTH.YEAR count
1  FEB. 2012     2
2  JAN. 2012     2
3  MAR. 2012     1

Antwoord 4, autoriteit 30%

Probeer de telfunctie in dplyr te gebruiken:

library(dplyr)
dat1_frame %>% 
    count(MONTH.YEAR)

Ik weet niet zeker hoe je MONTH-YEAR als variabelenaam hebt gekregen. Mijn R-versie staat zo’n variabelenaam niet toe, dus heb ik deze vervangen door MONTH.YEAR.

Als een kanttekening, de fout in je code was dat dat1_frame %.% group_by(MONTH-YEAR)zonder een functie summarisehet originele dataframe retourneert zonder enige wijzigingen. Dus je wilt gebruiken

dat1_frame %>%
    group_by(MONTH.YEAR) %>%
    summarise(count=n())

Antwoord 5, autoriteit 13%

library(plyr)
ddply(data, .(MONTH-YEAR), nrow)

Dit geeft u het antwoord als “MAAND-JAAR” een variabele is.
Probeer eerst unique(data$MONTH-YEAR) en kijk of het unieke waarden retourneert (geen duplicaten).

Dan zal bovenstaande simpele split-apply-combine je opleveren wat je zoekt.


Antwoord 6, autoriteit 11%

Alleen ter aanvulling de data.table-oplossing:

library(data.table)
mydf <- structure(list(ID = c(110L, 111L, 121L, 131L, 141L), 
                       MONTH.YEAR = c("JAN. 2012", "JAN. 2012", 
                                      "FEB. 2012", "FEB. 2012", 
                                      "MAR. 2012"), 
                       VALUE = c(1000L, 2000L, 3000L, 4000L, 5000L)), 
                  .Names = c("ID", "MONTH.YEAR", "VALUE"), 
                  class = "data.frame", row.names = c(NA, -5L))
setDT(mydf)
mydf[, .(`Number of rows` = .N), by = MONTH.YEAR]
   MONTH.YEAR Number of rows
1:  JAN. 2012              2
2:  FEB. 2012              2
3:  MAR. 2012              1

Antwoord 7

Stel dat we een df_data dataframe hebben zoals hieronder

> df_data
   ID MONTH-YEAR VALUE
1 110   JAN.2012  1000
2 111   JAN.2012  2000
3 121   FEB.2012  3000
4 131   FEB.2012  4000
5 141   MAR.2012  5000

Tel het aantal rijen in DF_DATA gegroepeerd op kolom Maand jaar, kunt u gebruiken:

> summary(df_data$`MONTH-YEAR`)
FEB.2012 JAN.2012 MAR.2012 
   2        2        1 


Samenvatting Functie maakt een tabel uit het factorargument en maak vervolgens een vector voor het resultaat (LINE 7 & AMP; 8)


Antwoord 8

Hier is een andere manier om aggregatete gebruiken om rijen per groep te tellen:

my.data <- read.table(text = '
    month.year    my.cov
      Jan.2000     apple
      Jan.2000      pear
      Jan.2000     peach
      Jan.2001     apple
      Jan.2001     peach
      Feb.2002      pear
', header = TRUE, stringsAsFactors = FALSE, na.strings = NA)
rows.per.group  <- aggregate(rep(1, length(my.data$month.year)),
                             by=list(my.data$month.year), sum)
rows.per.group
#    Group.1 x
# 1 Feb.2002 1
# 2 Jan.2000 3
# 3 Jan.2001 2

Other episodes