ведение нулевого счета с group_by в R - PullRequest
1 голос
/ 04 марта 2020

Я несколько дней пытаюсь решить проблему, связанную с использованием group_by () и sumrize (). У меня есть данные о питании, аналогичные этому набору данных:

library(tidyverse)

myData <- tibble(id = factor(c(rep("1", 5), rep("2", 4), rep("3", 6), rep("4", 5))),
                 gender = factor(c(rep("M", 5), rep("F", 4), rep("F", 6), rep("M", 5))),
                 age = c(rep("20-29", 5), rep("20-29", 4), rep("40-49", 6), rep("30-39", 5)),
                 bmi = c(rep("normal", 5), rep("normal", 4), rep("overweighted", 6), rep("underweighted", 5)),
                 food = factor(c("A", "A", "B", "C", "D", "D", "D", "A", "A", "B", "A", "B", "C", "C", "B", "D", "C", "E", "E", "A")),
                 food_class = factor(c("sweet", "sweet", "salty", "bitter", "acid", "acid", "acid", "sweet", "sweet",
                                "salty", "sweet", "salty", "bitter", "bitter", "salty", "acid", "bitter", 
                                "Other", "Other", "sweet")), 
                 quantity = c(25, 10, 15, 5, 15, 15, 30, 15, 5, 5, 10, 30, 15, 30, 10, 5, 5, 10, 15, 25))

myData %>%
  group_by(id,food, gender, food_class) %>%
  summarise(sum_quantity = sum(quantity)) %>%
  ungroup()%>%
  complete(id, food, food_class, fill = list(sum_quantity = 0))%>%
  group_by()

Что я получаю:


# A tibble: 100 x 5
   id    food  food_class gender sum_quantity
   <fct> <fct> <fct>      <fct>         <dbl>
 1 1     A     acid       NA                0
 2 1     A     bitter     NA                0
 3 1     A     Other      NA                0
 4 1     A     salty      NA                0
 5 1     A     sweet      M                35
 6 1     B     acid       NA                0
 7 1     B     bitter     NA                0
 8 1     B     Other      NA                0
 9 1     B     salty      M                15
10 1     B     sweet      NA                0
# … with 90 more rows

Я хочу проанализировать данные о питании моего набора данных и оценить потребление пищи каждый класс food_class путем суммирования количества съеденного людьми. Для этого мне нужно сохранить нулевые значения в подсчете среднего значения, в противном случае оно будет смещено. Но я также хочу сохранить такую ​​информацию, как пол или возрастная группа, чтобы я мог определить структуру потребления пищи для каждого пола, возраста и c.

С .drop = FALSE я получаю аберрантные комбинации моих переменных, поскольку каждый идентификатор будет объединен с обоими полами, даже у данного идентификатора есть заданный пол. Когда я использую complete (), я получаю много NA, и это усложняет анализ, потому что я не могу использовать аргумент заполнения для столбцов, где значения зависят, например, от пола или возраста.

Есть идеи, как решить мою проблему? Большое спасибо.

1 Ответ

0 голосов
/ 04 марта 2020

Используйте nesting() в complete(), чтобы сохранить комбинации значений, которые появляются в данных.

myData %>%
  group_by_at(vars(-quantity)) %>%
  summarise(sum_quantity = sum(quantity)) %>%
  ungroup %>%
  complete(nesting(id, gender, age, bmi),
           nesting(food, food_class),
           fill = list(sum_quantity = 0))

# # A tibble: 20 x 7
#    id    gender age   bmi           food  food_class sum_quantity
#    <fct> <fct>  <chr> <chr>         <fct> <fct>             <dbl>
#  1 1     M      20-29 normal        A     sweet                35
#  2 1     M      20-29 normal        B     salty                15
#  3 1     M      20-29 normal        C     bitter                5
#  4 1     M      20-29 normal        D     acid                 15
#  5 1     M      20-29 normal        E     Other                 0
#  6 2     F      20-29 normal        A     sweet                20
#  7 2     F      20-29 normal        B     salty                 0
#  8 2     F      20-29 normal        C     bitter                0
#  9 2     F      20-29 normal        D     acid                 45
# 10 2     F      20-29 normal        E     Other                 0
# 11 3     F      40-49 overweighted  A     sweet                10
# 12 3     F      40-49 overweighted  B     salty                45
# 13 3     F      40-49 overweighted  C     bitter               45
# 14 3     F      40-49 overweighted  D     acid                  0
# 15 3     F      40-49 overweighted  E     Other                 0
# 16 4     M      30-39 underweighted A     sweet                25
# 17 4     M      30-39 underweighted B     salty                 0
# 18 4     M      30-39 underweighted C     bitter                5
# 19 4     M      30-39 underweighted D     acid                  5
# 20 4     M      30-39 underweighted E     Other                25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...