policz liczbę wierszy w ramce danych w R na podstawie grupy [duplikat]

To pytanie ma już odpowiedź tutaj:

Mam ramkę danych w R Tak:

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

Tak więc dla każdego miesiąca każdego roku są n wiersze i mogą być w dowolnej kolejności (oznacza to, że wszystkie nie są w ciągłości i są w przerwach). Chcę obliczyć ile wierszy jest tam dla każdego MONTH-YEAR tj. ile wierszy jest dla Jana. 2012, ile za luty 2012 i tak dalej. Coś takiego:

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

Próbowałem to zrobić:

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

Ale nie daje pożądanej wydajności.Jak mogę to zrobić?

Author: A5C1D2H2I1M1N2O1R2T1, 2014-08-13

8 answers

Oto przykład, który pokazuje, w jaki sposób table(.) (lub, bardziej dopasowując pożądany wynik, data.frame(table(.)) robi to, o co prosisz.

Zwróć również uwagę na to, jak udostępniać powtarzalne przykładowe dane w sposób, który inni mogą kopiować i wklejać do swojej sesji.

Oto (powtarzalne) przykładowe dane:

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

Oto obliczenie liczby wierszy na grupę, w dwóch wyjściowych formatach wyświetlania:

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
 27
Author: A5C1D2H2I1M1N2O1R2T1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-13 18:36:47

Funkcja count() w plyr robi to, co chcesz:

library(plyr)

count(mydf, "MONTH-YEAR")
 31
Author: Head,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-04 08:00:17

Używając przykładowego zestawu danych, który Ananda zmyślił, oto przykład użycia aggregate(), który jest częścią rdzenia R. aggregate() potrzebuje tylko czegoś, co liczy się jako funkcja różnych wartości MONTH-YEAR. W tym przypadku użyłem VALUE jako rzeczy do liczenia:

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

Co daje..

  MONTH.YEAR count
1  FEB. 2012     2
2  JAN. 2012     2
3  MAR. 2012     1
 10
Author: Andy Clifton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-13 20:05:31
library(plyr)
ddply(data, .(MONTH-YEAR), nrow)

To daje odpowiedź, jeśli" miesiąc-rok " jest zmienną. Najpierw spróbuj unique (data$MONTH-YEAR) i sprawdź, czy zwraca unikalne wartości (bez duplikatów).

Następnie powyżej simple split-apply-combine zwróci to, czego szukasz.

 5
Author: won782,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-13 18:12:24

Spróbuj użyć funkcji count w dplyr:

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

Nie jestem pewien, skąd masz miesiąc-rok jako nazwę zmiennej. Moja wersja R nie pozwala na taką nazwę zmiennej, więc zamieniłem ją na MONTH.Roku.

Na marginesie, błędem w Twoim kodzie było to, że dat1_frame %.% group_by(MONTH-YEAR) bez funkcji summarise zwraca oryginalną ramkę danych bez żadnych modyfikacji. Więc chcesz użyć

dat1_frame %>%
    group_by(MONTH.YEAR) %>%
    summarise(count=n())
 5
Author: Kate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-05 22:35:12

Tylko dla uzupełnienia danych.rozwiązanie tabeli:

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
 3
Author: User2321,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-16 13:49:02

Oto inny sposób użycia aggregate do liczenia wierszy według grupy:

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
 1
Author: Mark Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-14 15:26:34

Załóżmy, że mamy ramkę danych df_data jak poniżej

> 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

Aby zliczyć liczbę wierszy w df_data pogrupowanych według kolumny miesiąc-rok, możesz użyć:

> summary(df_data$`MONTH-YEAR`)

FEB.2012 JAN.2012 MAR.2012 
   2        2        1 

Tutaj wpisz opis obrazka funkcja summary utworzy tabelę z argumentu factor, a następnie utworzy wektor dla wyniku (linia 7 i 8)

 0
Author: Tung Nguyen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-22 04:09:28