подсчет количества строк в кадре данных в 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
функция summary создаст таблицу из аргумента factor, а затем создаст вектор для результата (строка 7 & 8)