如何在R DataFrame中用lead函数获取欢迎饮后各饮品首次饮用时间?
解决方案
首先构造可复现的原始数据框:
df <- data.frame( Name = rep("Josh", 6), Date = as.Date(c("2022-06-24", "2022-07-01", "2022-07-03", "2022-07-24", "2022-07-28", "2022-07-29")), Drink = c("Welcome Drink", "Beer", "Wine", "Cocktail", "Wine", "Beer") )
方法一:明确指定饮品聚合
适合已知所有饮品类型的场景,直接分组后提取每种饮品的首次日期:
library(tidyverse) result <- df %>% group_by(Name) %>% summarize( `Welcome drink` = first(Date[Drink == "Welcome Drink"]), `1stBeer` = first(Date[Drink == "Beer"]), `1stWine` = first(Date[Drink == "Wine"]), `1stCocktail` = first(Date[Drink == "Cocktail"]) ) # 输出结果 result
方法二:动态适配所有饮品类型
如果饮品类型不确定,用动态分组转宽的方式更灵活:
library(tidyverse) result <- df %>% # 按姓名和饮品分组,取首次饮用日期 group_by(Name, Drink) %>% summarize(first_date = first(Date)) %>% ungroup() %>% # 转成宽格式,自动处理列名 pivot_wider( names_from = Drink, values_from = first_date, names_prefix = "1st", # 单独调整Welcome Drink的列名 names_transform = ~ ifelse(.x == "Welcome Drink", "Welcome drink", .x) ) %>% # 调整列顺序,把Welcome drink放在最前面 select(Name, `Welcome drink`, everything()) # 输出结果 result
为什么lead()不适用?
lead()函数的作用是提取同一分组中后续行的值,它是针对行序列的偏移操作,而非聚合分组内的首次出现值,所以无法满足“提取每种饮品首次饮用时间”的需求。
内容的提问来源于stack exchange,提问作者afml
相关产品推荐
相关产品推荐

