基于两种不同条件使用R统计列数据的求助
解决R语言中邮件订阅状态变更统计问题
嘿,作为R新手碰到这种数据处理问题确实头疼,两周时间够磨人的了!我来帮你搞定这个需求~
首先咱们明确核心需求:
- 新退订数:邮箱从
Subscribed变为Unsubscribed的数量 - 现有订阅数:邮箱始终保持
Subscribed的数量
我推荐用dplyr包来处理,它的语法直观,很适合新手上手。下面一步步来:
步骤1:准备数据(模拟你的数据集)
先把你给的示例数据转换成R可处理的格式:
# 先加载dplyr包,如果没安装先运行 install.packages("dplyr") library(dplyr) # 构造示例数据集 df <- tibble( Email = c("fake@123", "real@123", "fake@123", "real@123"), Status = c("Subscribed", "Subscribed", "Unsubscribed", "Subscribed") )
步骤2:分组处理状态
我们需要按邮箱分组,然后判断每个邮箱的状态是否变更,以及最新状态是什么:
processed_df <- df %>% # 按邮箱分组,让每个邮箱的状态数据聚在一起 group_by(Email) %>% summarise( # 判断该邮箱是否有过状态变更(状态种类大于1) status_changed = n_distinct(Status) > 1, # 获取最新状态:这里默认数据是按时间先后排序的,如果你的数据有时间列,记得先按时间排序! # 比如如果有timestamp列,就先加一行 arrange(Email, timestamp) latest_status = last(Status) ) %>% # 根据条件分类 mutate( category = case_when( # 有变更且最新状态是退订 → 新退订 status_changed & latest_status == "Unsubscribed" ~ "新退订", # 无变更且始终是订阅 → 现有订阅 !status_changed & latest_status == "Subscribed" ~ "现有订阅", # 其他情况(比如从退订变回订阅)可以根据你的需求调整 TRUE ~ "其他状态变更" ) )
步骤3:统计各类别数量
最后统计每个类别的邮箱数量:
count_result <- processed_df %>% count(category) # 查看结果 print(count_result)
运行后你会得到和你预期一致的结果:
# A tibble: 2 × 2 category n <chr> <int> 1 新退订 1 2 现有订阅 1
新手注意事项
- 如果你的原始数据没有按时间排序,一定要先添加时间列(或者你有记录状态变化顺序的列),然后用
arrange(Email, 时间列)排序,不然last(Status)取到的不是最新状态,结果会出错! - 如果还有其他状态变化场景(比如用户先退订又订阅),可以修改
case_when里的条件来适配你的需求。
内容的提问来源于stack exchange,提问作者Stick
相关产品推荐
相关产品推荐

