在R中对分组数据循环生成条件新变量的实现方法
问题
我有两个数据框,一个以id作为主键,另一个是长格式数据。将二者合并后得到长格式数据(该操作可还原)。我已经按id对数据进行分组,希望遍历每个分组,基于特定条件为组内每行生成新变量:
- 若组内存在
sdx为TRUE的行,new_variable为当前行与前一行date的时间差,组内第一行赋值为0; - 若组内没有
sdx为TRUE的行,new_variable赋值为NA。
示例数据如下:
df <- data.frame(structure( list(id = c("0000", "0000", "0000", "0001", "0001", "0001", "0002", "0002", "0002", "0002"), sex = c("F", "F", "F", "F", "F", "F", "F", "F", "F", "F"), age_fcat = structure(c(5L, 5L, 5L, 2L, 2L, 2L, 4L, 4L, 4L, 4L), levels = c("18-34", "35-44", "45-54", "54-64", "65+" ), class = "factor"), avg_s = c(161, 161, 155.666666666667, 146, 140, 144, 139, 173, 152.875, 156.5), alx = c(88, 88, 90.3333333333333, 76, 78, 73, 86, 97, 82, 97.2), date = seq(as.Date("1990/1/1"), as.Date("1999/1/1"), "years"), sdx = c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE) )))
解决方案
使用dplyr包的分组操作可高效实现需求,代码如下:
library(dplyr) result_df <- df %>% group_by(id) %>% mutate( new_variable = ifelse(any(sdx), c(0, diff(date)), NA_real_) ) %>% ungroup() print(result_df)
代码说明
group_by(id):按id分组,对每个用户的数据单独处理;any(sdx):判断当前组内是否存在sdx为TRUE的行;diff(date):计算相邻行date的时间差(以天为单位),组内第一行用0填充;ifelse:根据组内是否有sdx=TRUE分配值,无符合条件行则赋值为NA;ungroup():取消分组状态,回归普通数据框格式。
预期结果
处理后的数据呈现以下特征:
id=0000和id=0002组存在sdx=TRUE的行,new_variable第一行为0,后续行均为365(因示例中日期间隔为1年);id=0001组无sdx=TRUE的行,new_variable全部为NA。
内容的提问来源于stack exchange,提问作者blessingAlabi
相关产品推荐
相关产品推荐

