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

在R中计算非平衡面板的滚动2天唯一观测数

非平衡面板数据计算过去2天内唯一id2数量的解决方案

针对非平衡面板数据,我们可以通过按个体分组后,对每个观测的日期计算时间区间内的唯一值来实现需求,替代基于行窗口的rollify(因为非平衡面板中行数和日期不一一对应,行窗口无法准确匹配时间范围)。

完整代码

library(dplyr)

# 构造示例数据
W <- matrix(c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,
              1,2,2,2,3,4,4,5,1,1,2,2,3,4,5,5,
              2,2,2,2,2,2,2,2,2,3,2,3,2,3,2,2), 
            ncol=3, nrow=16)
W <- as.data.frame(W)
colnames(W) <- c('id1','day','id2')

# 核心处理逻辑
W <- W %>%
  arrange(id1, day) %>%  # 先按个体和日期排序,确保时间顺序正确
  group_by(id1) %>%      # 按个体分组
  mutate(
    n_unique = sapply(day, function(current_day) {
      # 筛选当前日期前2天内(即 day >= current_day-2 且 day < current_day)的所有id2
      target_ids <- id2[day >= (current_day - 2) & day < current_day]
      # 如果没有符合条件的数据,返回NA;否则计算唯一值数量
      if (length(target_ids) == 0) NA else n_distinct(target_ids)
    })
  ) %>%
  ungroup()

# 查看结果
print(W)

代码说明

  1. 排序:先按id1和day排序,保证每个个体内的观测按时间顺序排列,避免时间混乱。
  2. 分组处理:按id1分组,确保只计算同一个体的历史数据。
  3. 时间区间筛选:对每个观测的current_day,筛选出该个体下日期在[current_day-2, current_day-1]的所有id2,再计算唯一值数量。如果该区间没有数据(比如current_day=1时),返回NA。
  4. 替代rollify的原因:rollify是基于行的滑动窗口,而非时间窗口。在非平衡面板中,同一日期可能有多行数据,不同日期的行数差异大,行窗口无法准确匹配“过去2天”的时间范围,因此不能直接使用。

结果验证

运行代码后得到的结果与期望输出完全一致:

id1 day id2 n_unique
1    1   1   2       NA
2    1   2   2        1
3    1   2   2        1
4    1   2   2        1
5    1   3   2        1
6    1   4   2        1
7    1   4   2        1
8    1   5   2        1
9    2   1   2       NA
10   2   1   3       NA
11   2   2   2        2
12   2   2   3        2
13   2   3   2        2
14   2   4   3        2
15   2   5   2        2
16   2   5   2        2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:37:32