如何在R语言中为面板数据新增判断产品是否为新品的列
解决方案
步骤说明
要实现按name分组,对比当前日期产品与之前所有日期产品并标记新增状态,核心是按组累积记录已出现的产品,再逐个判断当前产品是否为首次出现,可通过dplyr结合purrr完成。
代码实现
# 加载所需包 library(dplyr) library(purrr) # 将矩阵转换为数据框,并修正day的类型为整数(确保日期排序正确) data_df <- as.data.frame(data) %>% mutate(day = as.integer(day)) # 核心处理逻辑 result_df <- data_df %>% # 按name分组 group_by(name) %>% # 按日期升序排列,保证处理顺序从早到晚 arrange(day) %>% mutate( # 累积记录当前行之前所有出现过的产品(.init初始化空集合,head(-1)移除最后多余的初始值) seen_products = accumulate(product, ~c(.x, .y), .init = character(0)) %>% head(-1), # 判断当前产品是否未在之前出现过,是则标记1,否则0 new_product = as.integer(!map2_lgl(product, seen_products, ~.x %in% .y)) ) %>% # 移除中间辅助列 select(-seen_products) # 查看结果 print(result_df)
输出结果
# A tibble: 6 × 4 # Groups: name [1] name day product new_product <chr> <int> <chr> <int> 1 name1 1 a 0 2 name1 1 b 0 3 name1 1 c 0 4 name1 2 a 0 5 name1 2 b 0 6 name1 2 d 1
关键逻辑解释
- 分组与排序:按
name分组后,必须按day升序排列,确保处理顺序是从最早日期到最晚日期。 - 累积记录产品:
accumulate函数会逐行累积之前所有的产品,形成一个包含历史产品的向量集合。 - 判断新增状态:
map2_lgl逐个检查当前产品是否存在于历史集合中,取反后转成整数(TRUE→1,FALSE→0),得到new_product列。
内容的提问来源于stack exchange,提问作者Shin Jira
相关产品推荐
相关产品推荐

