Хобрук: Ваш путь к мастерству в программировании

Как запустить tapply () для нескольких столбцов фрейма данных с помощью R?

У меня есть такой фрейм данных:

a   b1  b2  b3  b4  b5  b6  b7  b8  b9
D   4   6   9   5   3   9   7   9   8
F   7   3   8   1   3   1   4   4   3
R   2   5   5   1   4   2   3   1   6
D   9   2   1   4   3   3   8   2   5
D   5   4   3   1   6   4   1   8   3
R   3   7   9   1   8   5   3   4   2
D   4   1   8   2   6   3   2   7   5
F   7   1   7   2   7   1   6   2   4
D   6   3   9   3   9   9   7   1   2

Функция tapply(df[,2], INDEX = df$a, sum) отлично работает для создания таблицы, которая суммирует все в df [, 2] с помощью df $ a, но когда я пытаюсь tapply(df[,2:10], INDEX = df$a, sum) получить аналогичную таблицу, за исключением суммы для каждого столбца (2, 3, 4, .. ., 10), я получаю сообщение об ошибке:

Ошибка в tapply (df [, 2:10], INDEX = df $ a, sum): аргументы должны иметь одинаковую длину

Кроме того, я хотел бы, чтобы имена строк таблицы были именами столбцов df[,2:10], так, чтобы строка 1 была b1, строка 2 была b2, а строка 9 была b9.

11.08.2011

Ответы:


1

Это потому, что tapply работает с векторами и преобразует df [, 2: 10] в вектор. Рядом с этим сумма даст вам общую сумму, а не сумму по столбцу. Используйте aggregate(), например:

aggregate(df[,2:10],by=list(df$a), sum)

Если вы хотите, чтобы список возвращался, вы можете использовать для этого by (). Обязательно укажите colSums вместо sum, поскольку by работает с разделенным фреймом данных:

by(df[,2:10],df$a,FUN=colSums)
11.08.2011

2

Другая возможность - объединить apply и tapply.

apply(df[,-1], 2, function(x) tapply(x, df$a, sum))

Будет производить вывод (который представляет собой матрицу)

    b1  ...   b9
D   sD1 ...  sD9
F   sF1 ...  sF9
R   sR1 ...  sR9

Затем вы можете использовать as.data.frame() для получения фрейма данных в качестве вывода.

13.05.2014

3

Вот способ применить data.table к этой проблеме.

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

И вот подход dplyr

library(dplyr)
df %>% group_by(a) %>% summarise_all(funs(sum))
01.06.2015
  • summarise_each() устарел. Вместо этого используйте summarise_all(), summarise_at() или summarise_if(). Чтобы отобразить funs по всем переменным, используйте summarise_all() 23.05.2018
  • А что делает .SD внутри lapply? 23.05.2018
  • .SD означает что-то вроде Subset of Data.table. Начальное значение. Не имеет значения, за исключением того, что это делает еще более маловероятным, что возникнет конфликт с определенным пользователем именем столбца. 23.05.2018
  • Новые материалы

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..