Агрегирование двух столбцов в R-кадре данных - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть датафрейм в R под названием food:

foodID   calories   fat    protein

 123       0.5      0.4     0.9
 432       0.65     0.3     0.7
 123       0.32     0.6     0.5
 983       0.82     0.2     0.6

и я пытаюсь в среднем увеличить столбец калорий и белков на foodID .

Я пытался:

cal_pro <- aggregate(food[2,4], list(food$foodID), function(df) mean(df))

Но похоже, что я не могу выбрать столбцы для применения средней функции по пище [2,4]? Может ли кто-нибудь помочь мне в этом.

Ответы [ 3 ]

1 голос
/ 12 апреля 2019

Используя dplyr, вы можете просто group_by и summarize:

food %>%
    group_by(foodID) %>%
    summarize(calories_average = mean(calories),
              protein_average = mean(protein))

# A tibble: 3 x 3
  foodID calories_average protein_average
   <int>            <dbl>           <dbl>
1    123             0.41             0.7
2    432             0.65             0.7
3    983             0.82             0.6

Вместо указания каждой переменной вы можете использовать summarize_at, чтобы выбрать несколько переменных для суммирования сразу. Мы передаем 2 аргумента: переменные для суммирования и список функций, которые необходимо применить к ним. Если список назван так, как здесь, то имя добавляется в сводный столбец в виде суффикса (с указанием «calores_average» и «protein_average»:

food %>%
    group_by(foodID) %>%
    summarize_at(c('calories', 'protein'), list(average = mean))

summarize_at также позволяет использовать различные вспомогательные функции для выбора переменных по префиксу, суффиксу или регулярному выражению (как показано ниже). Вы можете узнать больше о них здесь: ?tidyselect::select_helpers

food %>%
    group_by(foodID) %>%
    summarize_at(vars(matches('calories|protein')), list(average = mean))
0 голосов
/ 12 апреля 2019

Вы можете использовать data.table пакет-

> setDT(dt)[,list(avg_calorie=mean(calories),avg_protein=mean(protein)),by=foodID]

Выход-

    foodID avg_calorie avg_protein
1:    123        0.41         0.7
2:    432        0.65         0.7
3:    983        0.82         0.6
0 голосов
/ 12 апреля 2019

Мы можем использовать метод формулы

aggregate(cbind(calories, protein) ~ foodID, food, mean)

Или, используя код OP, это должно быть c (2, 4), потому что, если мы сделаем 2, 4, он выбирает 2-ую строку 4-го столбца по индексации строки / столбца

aggregate(food[c(2, 4)], list(food$foodID), mean)

РЕДАКТИРОВАТЬ: На основе комментариев @RuiBarradas

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...