У меня есть фрейм данных, и я хотел бы подсчитать количество строк в каждой группе. Я регулярно использую эту aggregate
функцию для суммирования данных следующим образом:
df2 <- aggregate(x ~ Year + Month, data = df1, sum)
Теперь я хотел бы посчитать наблюдения, но не могу найти подходящего аргумента FUN
. Интуитивно я думал, что это будет так:
df2 <- aggregate(x ~ Year + Month, data = df1, count)
Но не тут-то было.
Любые идеи?
Некоторые данные игрушек:
set.seed(2)
df1 <- data.frame(x = 1:20,
Year = sample(2012:2014, 20, replace = TRUE),
Month = sample(month.abb[1:3], 20, replace = TRUE))
nrow
,NROW
,length
...nrow
не работает для меня , ноNROW
иlength
работал отлично. +1Ответы:
Текущая лучшая практика (tidyverse):
источник
cbind
результатыaggregate(Sepal.Length ~ Species, iris, mean)
иaggregate(Sepal.Length ~ Species, iris, length)
df %>% group_by(group, variable) %>% mutate(count = n())
Следуя предложению @Joshua, вот один из способов подсчета количества наблюдений в вашем
df
фрейме данных, гдеYear
= 2007 иMonth
= ноя (при условии, что это столбцы):и с помощью
aggregate
@GregSnow:источник
dplyr
package делает это с помощьюcount
/tally
commands илиn()
функции :Для начала немного данных:
Теперь посчитаем:
Мы также можем использовать немного более длинную версию с трубопроводом и
n()
функцией:или
tally
функция:источник
Старый вопрос без
data.table
решения. Итак, начнем ...С помощью
.N
источник
.()
вместоlist()
иsetDT()
для преобразования data.frame в data.table. Итак, за один шагsetDT(df)[, .N, by = .(year, month)]
.Самый простой вариант использования
aggregate
- этоlength
функция, которая даст вам длину вектора в подмножестве. Иногда нужно использовать немного более надежныйfunction(x) sum( !is.na(x) )
.источник
Создайте новую переменную
Count
со значением 1 для каждой строки:Затем объедините фрейм данных, суммируя по
Count
столбцу:источник
aggregate
, нет необходимости переименовать каждую переменную вby=
как иlist(year=df1$year)
т.д.data.frame
этоlist
уже такaggregate(df1[c("Count")], by=df1[c("Year", "Month")], FUN=sum, na.rm=TRUE)
будет работать.Альтернативой
aggregate()
функции в этом случае будетtable()
withas.data.frame()
, которая также укажет, какие комбинации года и месяца связаны с нулевым вхождением.И без нулевых комбинаций
источник
Если вы хотите включить 0 отсчетов для месяцев-лет, которые отсутствуют в данных, вы можете использовать небольшое
table
волшебство.Например, игрушечный data.frame в вопросе df1 не содержит наблюдений за январь 2014 года.
Базовая
aggregate
функция R не возвращает наблюдение за январь 2014 г.Если вы хотите наблюдать за этим месяцем-годом с 0 в качестве счетчика, то приведенный выше код вернет data.frame со счетчиками для всех комбинаций месяц-год:
источник
Для моих агрегатов я обычно в конечном итоге хочу видеть среднее значение и «насколько велика эта группа» (также известная как длина). Так что это мой удобный фрагмент для тех случаев;
источник
А sqlрешение с использованием
sqldf
пакета:источник
Учитывая ответ @Ben, R выдаст ошибку, если
df1
не содержитx
столбца. Но это можно элегантно решить с помощьюpaste
:Точно так же его можно обобщить, если в группировке используется более двух переменных:
источник
Ты можешь использовать
by
функции, так как ониby(df1$Year, df1$Month, count)
будут производить список необходимого агрегирования.Результат будет выглядеть так:
источник
Здесь уже есть множество замечательных ответов, но я хотел добавить еще один вариант для тех, кто хочет добавить новый столбец в исходный набор данных, который содержит количество повторений этой строки.
То же самое можно сделать, объединив любой из приведенных выше ответов с
merge()
функцией.источник
Если вы попробуете совокупные решения, указанные выше, и получите ошибку:
недопустимый тип (список) для переменной
Поскольку вы используете дату или дату и время, попробуйте использовать as.character для переменных:
По одной или обеим переменным.
источник