如何基于数据框行数与事件时长为每行分配对应日期
按行分组为数据框分配日期
需求说明
现有15行的mydf数据框,需基于event_length=3将行均分为3组(每组5行),并按以下规则分配日期:
- 前5行填充最早日期
2023-07-22 - 第6-10行填充中间日期
2023-07-23 - 最后5行填充最晚日期
2023-07-24
注意:原始代码中dates_to_assign的写法会被识别为数值运算,需用as.Date()转换为日期类型。
推荐方案:向量化实现(高效无循环)
R中优先使用向量化操作,避免循环提升运行效率:
# 修正日期定义,转换为日期类型 event_length <- 3 dates_to_assign <- as.Date(c("2023-07-24", "2023-07-23", "2023-07-22")) # 计算每组行数 rows_per_group <- nrow(mydf) / event_length # 生成对应日期向量(反转日期顺序以匹配需求) assigned_dates <- rep(rev(dates_to_assign), each = rows_per_group) # 为数据框的date列赋值 mydf$date <- assigned_dates
循环实现(匹配你的初始思路)
如果一定要用for()循环,可按组的索引范围逐一赋值:
event_length <- 3 dates_to_assign <- as.Date(c("2023-07-24", "2023-07-23", "2023-07-22")) rows_per_group <- nrow(mydf) / event_length # 遍历每个日期组 for (i in 1:event_length) { # 计算当前组的行起止位置 start_row <- (i - 1) * rows_per_group + 1 end_row <- i * rows_per_group # 按需求顺序赋值(反转日期列表) mydf$date[start_row:end_row] <- rev(dates_to_assign)[i] }
验证结果
执行后mydf的date列会按需求填充,示例输出如下:
mydf #> name date #> 1 john 2023-07-22 #> 2 joe 2023-07-22 #> 3 brian 2023-07-22 #> 4 harry 2023-07-22 #> 5 wes 2023-07-22 #> 6 will 2023-07-23 #> 7 dan 2023-07-23 #> 8 william 2023-07-23 #> 9 steve 2023-07-23 #> 10 dom 2023-07-23 #> 11 andrew 2023-07-24 #> 12 shaun 2023-07-24 #> 13 mark 2023-07-24 #> 14 ben 2023-07-24 #> 15 dan 2023-07-24
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

