You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

关键逻辑解释

  1. 分组与排序:按name分组后,必须按day升序排列,确保处理顺序是从最早日期到最晚日期。
  2. 累积记录产品:accumulate函数会逐行累积之前所有的产品,形成一个包含历史产品的向量集合。
  3. 判断新增状态:map2_lgl逐个检查当前产品是否存在于历史集合中,取反后转成整数(TRUE→1,FALSE→0),得到new_product列。

内容的提问来源于stack exchange,提问作者Shin Jira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:25:13