Сумма строк на основе значения столбца

Я хочу суммировать строки, которые имеют одинаковое значение в одном столбце:

> df  df X1 X2 X3 1 a 1 3 2 b 5 3 3 a 3 4 4 c 6 5 5 c 2 2 

Для одного столбца (X2) данные могут быть агрегированы для получения сумм всех строк, имеющих одно и то же значение X1:

 > ddply(df, .(X1), summarise, X2=sum(X2)) X1 X2 1 a 4 2 b 5 3 c 8 

Как мне сделать то же самое для X3 и произвольное количество других столбцов, кроме X1?

Это результат, который я хочу:

  X1 X2 X3 1 a 4 7 2 b 5 3 3 c 8 7 

 ddply(df, "X1", numcolwise(sum)) 

см. « ?numcolwise для подробностей и примеров.

aggregate может легко сделать это с помощью интерфейса формулы:

 aggregate(. ~ X1, data=df, FUN=sum) ## X1 X2 X3 ## 1 a 4 7 ## 2 b 5 3 ## 3 c 8 7 

Эквивалентное:

 aggregate(cbind(X2, X3) ~ X1, data=df, FUN=sum) 

aggregate – отличная функция для таких вещей:

 aggregate(df[,-1],df["X1"],sum) X1 X2 X3 1 a 4 7 2 b 5 3 3 c 8 7 

И базовая версия R numcolwise метода от plyr:

 aggregate(df[,sapply(df,is.numeric)],df["X1"],sum) 

Решение data.table для эффективности памяти и элегантности кодирования

 library(data.table) DT <- data.table(df) DT[, lapply(.SD, sum), by = X1] 

.SD - это подмножество таблицы данных. Для каждой группы, определяемой значениями X1 . Есть 3 полезные виньетки, связанные с пакетом data.table .

  • Интеграция Java-R?
  • Условное слияние / замена в R
  • Как отправить электронное письмо с приложением из R в windows
  • Специальные переменные в ggplot (..count .., ..density .. и т.д.)
  • data.table "ключевые индексы" или "групповой счетчик"
  • Используйте другой центр, чем основной меридиан, при построении карты мира
  • Оценка имени столбца и целевого значения в выражении `j` в` data.table`
  • Назначьте несколько столбцов, используя: = в data.table, по группе
  • Почему as.Date замедляет вектор символа?
  • чтение текстового файла в строке R
  • dplyr: «Ошибка в n (): функция не должна вызываться напрямую»
  • Давайте будем гением компьютера.