Dada uma tabela de formato longo, com duas colunas "group", quero criar uma nova coluna que tenha TRUE
se o valor existe no conjunto do grupo anterior .
Exemplo
Considere a tabela a seguir que mostra duas pessoas e o que elas compraram em cada dia.
df_groceries <- tibble::tribble(
~person, ~day, ~groceries,
"gary", "Mon", "tomatoes",
"gary", "Mon", "milk",
"gary", "Mon", "bread",
"gary", "Mon", "yogurt",
"gary", "Tue", "eggs",
"gary", "Tue", "cheese",
"gary", "Tue", "apples",
"gary", "Wed", "chicken",
"gary", "Wed", "rice",
"gary", "Wed", "apples",
"gary", "Thu", "lettuce",
"gary", "Thu", "sauce",
"gary", "Fri", "fish",
"gary", "Fri", "potatoes",
"gary", "Fri", "lettuce",
"gary", "Sat", "cereal",
"gary", "Sat", "bananas",
"gary", "Sat", "juice",
"gary", "Sun", "rice",
"gary", "Sun", "bananas",
"gary", "Sun", "cereal",
"rachel", "Mon", "spinach",
"rachel", "Mon", "mushrooms",
"rachel", "Mon", "pasta",
"rachel", "Tue", "mushrooms",
"rachel", "Tue", "broccoli",
"rachel", "Tue", "lemons",
"rachel", "Tue", "olive oil",
"rachel", "Wed", "avocados",
"rachel", "Wed", "lemons",
"rachel", "Thu", "chicken breast",
"rachel", "Thu", "quinoa",
"rachel", "Thu", "bell peppers",
"rachel", "Fri", "yogurt",
"rachel", "Fri", "berries",
"rachel", "Fri", "granola",
"rachel", "Sat", "yogurt",
"rachel", "Sat", "avocados",
"rachel", "Sun", "eggs",
"rachel", "Sun", "orange juice",
"rachel", "Sun", "whole wheat bread"
)
Quero calcular uma coluna adicional que indique se cada item de supermercado foi comprado no dia anterior (especificamente no dia anterior, não em qualquer dia anterior), discriminado por pessoa.
Por exemplo, como Gary comprou maçãs na terça e na quarta-feira, então devemos marcar TRUE
as maçãs de quarta-feira para Gary.
A saída desejada é, portanto:
df_groceries_desired_output <-
tibble::tribble(
~person, ~day, ~groceries, ~was_purchased_yesterday,
"gary", "Mon", "tomatoes", NA,
"gary", "Mon", "milk", NA,
"gary", "Mon", "bread", NA,
"gary", "Mon", "yogurt", NA,
"gary", "Tue", "eggs", FALSE,
"gary", "Tue", "cheese", FALSE,
"gary", "Tue", "apples", FALSE,
"gary", "Wed", "chicken", FALSE,
"gary", "Wed", "rice", FALSE,
"gary", "Wed", "apples", TRUE,
"gary", "Thu", "lettuce", FALSE,
"gary", "Thu", "sauce", FALSE,
"gary", "Fri", "fish", FALSE,
"gary", "Fri", "potatoes", FALSE,
"gary", "Fri", "lettuce", TRUE,
"gary", "Sat", "cereal", FALSE,
"gary", "Sat", "bananas", FALSE,
"gary", "Sat", "juice", FALSE,
"gary", "Sun", "rice", FALSE,
"gary", "Sun", "bananas", TRUE,
"gary", "Sun", "cereal", TRUE,
"rachel", "Mon", "spinach", NA,
"rachel", "Mon", "mushrooms", NA,
"rachel", "Mon", "pasta", NA,
"rachel", "Tue", "mushrooms", TRUE,
"rachel", "Tue", "broccoli", FALSE,
"rachel", "Tue", "lemons", FALSE,
"rachel", "Tue", "olive oil", FALSE,
"rachel", "Wed", "avocados", FALSE,
"rachel", "Wed", "lemons", TRUE,
"rachel", "Thu", "chicken breast", FALSE,
"rachel", "Thu", "quinoa", FALSE,
"rachel", "Thu", "bell peppers", FALSE,
"rachel", "Fri", "yogurt", FALSE,
"rachel", "Fri", "berries", FALSE,
"rachel", "Fri", "granola", FALSE,
"rachel", "Sat", "yogurt", TRUE,
"rachel", "Sat", "avocados", FALSE,
"rachel", "Sun", "eggs", FALSE,
"rachel", "Sun", "orange juice", FALSE,
"rachel", "Sun", "whole wheat bread", FALSE
)
Minha tentativa
Achei que isso seria tão fácil quanto usar %in%
o operador:
library(dplyr)
df_groceries |>
group_by(person) |>
mutate(day_as_number = case_match(day,
"Mon" ~ 1,
"Tue" ~ 2,
"Wed" ~ 3,
"Thu" ~ 4,
"Fri" ~ 5,
"Sat" ~ 6,
"Sun" ~ 7)) |>
mutate(was_purchased_yesterday = groceries %in% groceries[day_as_number == day_as_number - 1])
mas obtenho resultados sem sentido:
df_groceries
## # A tibble: 41 × 5
## # Groups: person [2]
## person day groceries day_as_number was_purchased_yesterday
## <chr> <chr> <chr> <dbl> <lgl>
## 1 gary Mon tomatoes 1 FALSE
## 2 gary Mon milk 1 TRUE
## 3 gary Mon bread 1 TRUE
## 4 gary Mon yogurt 1 TRUE
## 5 gary Tue eggs 2 FALSE
## 6 gary Tue cheese 2 TRUE
## 7 gary Tue apples 2 TRUE
## 8 gary Wed chicken 3 FALSE
## 9 gary Wed rice 3 TRUE
## 10 gary Wed apples 3 TRUE
## # ℹ 31 more rows
## # ℹ Use `print(n = ...)` to see more rows