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

этот вопрос уже есть ответ здесь:

  • количество строк в каждой группе 11 ответов

у меня есть фрейм данных в 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, сколько за февраль. 2012 и так далее. Что-то вроде этого:--7-->

 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))

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

8 ответов


вот пример, который показывает, как 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

на


используя пример набора данных, который Ананда придумал, вот пример использования aggregate(), который является частью ядра Р. 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

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

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

затем над простым split-apply-combine вернет то, что вы ищете.


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

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

Я не уверен, как вы получили месяц-год в качестве имени переменной. Моя версия R не допускает такого имени переменной, поэтому я заменил ее на месяц.ГОД.

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

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

только для завершения данных.решение таблицы:

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

вот еще один способ использования 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

Предположим, у нас есть фрейм данных 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, сгруппированных по столбцу месяц-год, вы можете использовать:

> summary(df_data$`MONTH-YEAR`)

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

enter image description here функция summary создаст таблицу из аргумента factor, а затем создаст вектор для результата (строка 7 & 8)