在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)
代码说明
- 排序:先按
id1和day排序,保证每个个体内的观测按时间顺序排列,避免时间混乱。 - 分组处理:按
id1分组,确保只计算同一个体的历史数据。 - 时间区间筛选:对每个观测的
current_day,筛选出该个体下日期在[current_day-2, current_day-1]的所有id2,再计算唯一值数量。如果该区间没有数据(比如current_day=1时),返回NA。 - 替代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
相关产品推荐
相关产品推荐

