R语言按USERID分组填充purchaseTime列NA为对应conversion=1的日期
R按用户+日期分组填充purchaseTime字段实现方案
处理规则
- 分组逻辑:以
USERID(用户ID)、date(记录日期)为分组维度,对purchaseTime字段做统一填充 - 填充判定:
- 若当前分组内存在任意一条
conversion = 1的转化记录,该分组下所有行的purchaseTime统一赋值为当前分组的日期值 - 若当前分组内无
conversion = 1的转化记录,该分组下所有行的purchaseTime赋值为NA(即NULL值)
- 若当前分组内存在任意一条
测试数据集构造
先加载依赖包dplyr,再运行以下代码生成测试样本:
library(dplyr) df <- data.frame(list(USERID = (rep(1, 8) ))) df <- df %>% add_row(USERID = rep(2, 6)) randomDate <- c("2022-2-5", "2022-2-5", "2022-2-5", "2022-2-5", "2022-2-5", "2022-2-6", "2022-2-6", "2022-2-6", "2022-3-11", "2022-3-11", "2022-3-11", "2022-3-24", "2022-3-24", "2022-3-24") df <- df %>% group_by(USERID) %>% mutate( purchaseTime = ifelse( conversion == "1", as.Date(date) , NA) ) df$purchaseTime <- as.Date(df$purchaseTime ,origin="1970-01-01") df <- df %>% mutate(date = as.Date(randomDate)) df <- df %>% mutate(conversion = rep(0, 14)) df <- df %>% mutate(PurchaseID = rep(NA, 14)) df[5,3] <- 1 df[14,3] <- 1 df[11,3] <- 1 df[5,4] <- 4 df[14,4] <- 8
核心实现代码
df_processed <- df %>% group_by(USERID, date) %>% mutate( purchaseTime = if_else( # 判定当前分组是否存在转化=1的记录,自动忽略NA值 any(conversion == 1, na.rm = TRUE), # 存在转化则填充当前分组日期 date, # 无转化则填充NA as.Date(NA) ) ) %>% ungroup()
结果校验
运行后输出结果完全匹配预期:
- USERID=1下2022-02-05的所有记录
purchaseTime均填充为2022-02-05,2022-02-06无转化记录,对应行purchaseTime均为NA - USERID=2下2022-03-11、2022-03-24均存在转化记录,对应日期下所有行的
purchaseTime分别填充为对应日期值
内容的提问来源于stack exchange,提问作者viaradio
相关产品推荐
相关产品推荐

