给定一个长格式表,其中包含两个“组”列,我想创建一个新列,该新列具有前一个TRUE
组的集合中是否存在该值。
例子
请考虑下表,其中显示了两个人以及他们每天购买的东西。
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"
)
我想计算一个额外的列,以指示每件杂货是否是在前一天(特别是前一天,而不是任何前一天)购买的,并区分每个人。
例如,由于加里在星期二和星期三都得到了苹果,那么我们应该TRUE
为加里标记星期三的苹果。
因此,所需的输出是:
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
)
我的尝试
我认为这应该像使用%in%
运算符一样简单:
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])
但我得到了毫无意义的结果:
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
我们可以对 和 本身进行连接
df_groceries
,将日期更改为前一天;任何匹配的都是重复,其他的都不是。我添加了特殊逻辑来排除"Mon"
下一个匹配的情况"Sun"
,不过如果你能使用实际日期而不是滚动日期,处理起来会更好。(已编辑:已修复以扭转
PriorDays
关系。)