У меня есть фрейм данных с двумя столбцами. Первый столбец содержит категории, такие как «Первый», «Второй», «Третий», а второй столбец содержит числа, которые представляют количество раз, когда я видел определенные группы из «Категории».
Например:
Category Frequency
First 10
First 15
First 5
Second 2
Third 14
Third 20
Second 3
Я хочу отсортировать данные по категориям и суммировать все частоты:
Category Frequency
First 30
Second 5
Third 34
Как бы я сделал это в R?
rowsum
.Ответы:
Использование
aggregate
:В приведенном выше примере несколько измерений могут быть указаны в
list
. Несколько агрегированных метрик одного и того же типа данных могут быть включены черезcbind
:(вложение комментария @thelatemail), также
aggregate
имеет интерфейс формулыИли, если вы хотите объединить несколько столбцов, вы можете использовать
.
нотацию (работает и для одного столбца)или
tapply
:Используя эти данные:
источник
Для этого вы также можете использовать пакет dplyr :
Или для нескольких итоговых столбцов (работает также с одним столбцом):
Вот еще несколько примеров того, как суммировать данные по группам, используя функции dplyr, используя встроенный набор данных
mtcars
:Для получения дополнительной информации, включая
%>%
оператора, смотрите введение в dplyr .источник
funs()
аргументаsummarise_all
и связанных с ним функций (summarise_at
,summarise_if
)Ответ, предоставленный rcs, работает и прост. Однако, если вы обрабатываете большие наборы данных и нуждаетесь в повышении производительности, есть более быстрая альтернатива:
Давайте сравним это с тем же, используя data.frame и выше:
И если вы хотите сохранить столбец, это синтаксис:
Различие станет более заметным с большими наборами данных, как показано в коде ниже:
Для нескольких агрегаций вы можете комбинировать
lapply
и.SD
следующим образомисточник
data[, sum(Frequency), by = Category]
. Вы можете использовать,.N
который заменяетsum()
функцию.data[, .N, by = Category]
, Вот полезная шпаргалка: s3.amazonaws.com/assets.datacamp.com/img/blog/...Вы также можете использовать функцию by () :
Эти другие пакеты (plyr, reshape) имеют преимущество, заключающееся в возврате data.frame, но с ним стоит ознакомиться, так как это базовая функция.
источник
Несколько лет спустя, просто чтобы добавить еще одно простое решение base R, которого по какой-то причине здесь нет,
xtabs
Или если вы хотите
data.frame
вернутьсяисточник
источник
Если
x
это фрейм данных с вашими данными, то следующее будет делать то, что вы хотите:источник
Несмотря на то, что недавно я стал конвертировать в
dplyr
большинство операций такого типа,sqldf
пакет по-прежнему действительно хорош (и ИМХО более читабелен) для некоторых вещей.Вот пример того, как можно ответить на этот вопрос
sqldf
источник
Просто чтобы добавить третий вариант:
РЕДАКТИРОВАТЬ: это очень старый ответ. Теперь я бы порекомендовал использовать
group_by
иsummarise
отdplyr
, как в ответе @docendo.источник
я нахожу
ave
очень полезным (и эффективным), когда вам нужно применить различные функции агрегирования для разных столбцов (и вы должны / хотите придерживаться базы R):например
Учитывая этот вклад:
мы хотим группе
Categ1
иCateg2
и вычислить суммуSamples
и среднее изFreq
.Вот возможное решение с использованием
ave
:Результат:
источник
Недавно добавленное
dplyr::tally()
теперь делает это проще, чем когда-либо:источник
Вы можете использовать функцию
group.sum
из пакета Rfast .Rfast имеет много групповых функций и
group.sum
является одной из них.источник
используя
cast
вместоrecast
(примечание'Frequency'
сейчас'value'
)получить:
источник
Другое решение, которое возвращает суммы по группам в матрице или кадре данных и является коротким и быстрым:
источник
Так
dplyr 1.0.0
какacross()
функция может быть использована:Если интересует несколько переменных:
И выбор переменных с помощью выбора помощников:
Образец данных:
источник