Подтвердить что ты не робот

Количество строк в кадре данных в R на основе группы

У меня есть кадр данных в R следующим образом:

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

Итак, за каждый месяц каждого года есть строки n, и они могут быть в любом порядке (значит, все они не находятся в непрерывности и находятся на разрывах). Я хочу рассчитать, сколько строк есть для каждого MONTH-YEAR то есть сколько строк для JAN. 2012, сколько для FEB. 2012 и так далее. Что-то вроде этого:

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

Я попытался сделать это:

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

но он не дает желаемого результата. Как я могу это сделать?

4b9b3361

Ответ 1

Вот пример, показывающий, как table(.) (или, более точно, соответствующий вашему желаемому результату, data.frame(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))

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

Здесь вычисляется количество строк на группу в двух форматах вывода:

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

Ответ 2

Функция count() в plyr делает то, что вы хотите:

library(plyr)

count(mydf, "MONTH-YEAR")

Ответ 3

Используя примерный набор данных, который Ананда фиктивный, вот пример использования aggregate(), который является частью ядра R. aggregate(), просто нуждается в том, чтобы считать функцию различных значений MONTH-YEAR. В этом случае я использовал VALUE как вещь для подсчета:

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

который дает вам..

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

Ответ 4

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

Это даст вам ответ, если "MONTH-YEAR" является переменной. Во-первых, попробуйте уникальный (данные $MONTH-YEAR) и посмотрите, не вернет ли он уникальные значения (без дубликатов).

Затем выше простого split-apply-comb вернет то, что вы ищете.

Ответ 5

Попробуйте использовать функцию count в dplyr:

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

Я не уверен, как вы получили MONTH-YEAR как имя переменной. Моя версия R не позволяет использовать такое имя переменной, поэтому я заменил ее на MONTH.YEAR.

В качестве побочной заметки ошибка в коде заключалась в том, что dat1_frame %.% group_by(MONTH-YEAR) без функции summarise возвращает исходный кадр данных без каких-либо изменений. Итак, вы хотите использовать

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

Ответ 6

Просто для завершения решения data.table:

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

Ответ 7

Вот еще один способ использования aggregate для подсчета строк по группам:

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

Ответ 8

Предположим, что у нас есть фрейм данных df_data, как показано ниже

> 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

Чтобы подсчитать количество строк в df_data, сгруппированных по столбцу MONTH-YEAR, вы можете использовать:

> summary(df_data$`MONTH-YEAR`)

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

введите описание изображения здесь сводная функция создаст таблицу из аргумента фактора, а затем создаст вектор для результата (строки 7 и 8).