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

在R中根据其他列条件替换前置行的值

解决DataFrame中按条件向前追溯调整时长的问题

我来帮你搞定这个需求!你之前的代码只能把剩余时间加到紧邻的前一行,没法处理需要继续往前找非eat/drink分类行的情况,下面给你一个清晰的解决方案:

核心思路

我们需要:

  • 定位所有满足activity == "drink"且duration > 5的行
  • 计算这些行需要转移的剩余时间(原时长 - 5),并将自身时长设为5
  • 从目标行的前一行开始,向上遍历找到第一个category != "eat/drink"的行,把剩余时间加到该行的时长上

完整代码实现

# 构造示例数据
activity <- c("car","soccer","eat","drink")
category <- c("travel","sport","eat/drink","eat/drink")
duration <- c(75,15,10,160)
df <- data.frame(activity, category,duration)

# 找到所有符合条件的drink行索引
drink_rows <- which(df$activity == "drink" & df$duration > 5)

# 遍历处理每个符合条件的行
for (row in drink_rows) {
  # 计算需要转移的额外时间
  extra_time <- df$duration[row] - 5
  # 将当前drink行的时长设为5
  df$duration[row] <- 5
  
  # 向前查找第一个非"eat/drink"分类的行
  target_row <- row - 1
  while (target_row >= 1 && df$category[target_row] == "eat/drink") {
    target_row <- target_row - 1
  }
  
  # 如果找到有效目标行,添加额外时间
  if (target_row >= 1) {
    df$duration[target_row] <- df$duration[target_row] + extra_time
  }
}

# 查看处理后的结果
print(df)

示例运行结果

执行后你会得到预期的输出:

activity category duration
1      car    travel       75
2   soccer     sport      170
3      eat eat/drink       10
4    drink eat/drink        5

可以看到,drink行的时长被设为5,剩余的155分钟成功加到了第2行(第一个非eat/drink的前置行)。

测试连续eat/drink场景

如果你的数据中有连续多个eat/drink分类的行,比如修改示例数据:

activity <- c("car","eat","eat","drink")
category <- c("travel","eat/drink","eat/drink","eat/drink")
duration <- c(75,15,10,160)
df <- data.frame(activity, category,duration)

运行同样的代码,剩余时间会加到第1行:

activity category duration
1      car    travel      230
2      eat eat/drink       15
3      eat eat/drink       10
4    drink eat/drink        5

这个方法逻辑清晰,能灵活处理任意数量的连续eat/drink行,完美匹配你的需求!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:52:42