在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
相关产品推荐
相关产品推荐

