R语言分组处理:将日期差30天内的组首行同步标记值
解决R语言分组后首行InWindow字段同步第二行值的问题
模拟数据
df <- data.frame( ID = c(1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4), Date = as.Date(c("2011-01-01", "2011-01-01", "2011-01-29", "2012-04-27", "2012-10-01", "2013-08-15", "2013-12-12", "2014-01-01", "2014-03-02", "2014-09-17", "2014-09-17")) )
修改后的完整处理代码
library(dplyr) df_processed <- df %>% group_by(ID) %>% mutate( LagDate = lag(Date), Diff = Date - LagDate, InWindow = ifelse(Diff < 30, TRUE, FALSE) ) %>% # 将组内首行的InWindow替换为第二行的值 mutate(InWindow = case_when( row_number() == 1 ~ InWindow[2], TRUE ~ InWindow )) %>% ungroup() print(df_processed)
代码说明
- 基础计算:按
ID分组后,用lag(Date)获取前一行日期,计算日期差值Diff,再判断差值是否小于30天得到初始的InWindow标记。此时组内首行因无前置数据,InWindow为NA。 - 首行值替换:新增
mutate步骤,通过row_number() == 1定位组内首行,直接取组内第二行的InWindow值覆盖首行的NA;其余行保持原有标记不变。 - 取消分组:最后用
ungroup()解除分组状态,避免对后续数据操作造成影响。
边界情况处理(可选)
如果数据中存在仅含单行的ID,InWindow[2]会返回NA,可按需补充逻辑,例如:
mutate(InWindow = case_when( n() == 1 ~ NA, # 单行组保持NA,或设为其他默认值 row_number() == 1 ~ InWindow[2], TRUE ~ InWindow ))
内容的提问来源于stack exchange,提问作者shollaback
相关产品推荐
相关产品推荐

