如何基于dplyr为R数据框新增列标记其他列活动状态
R/dplyr实现ClassAtSplit列的高效计算方案
需求说明
需要在现有数据框中新增ClassAtSplit列,计算逻辑完全匹配示例Excel公式规则:
- 若当前行
SplitCode为0,ClassAtSplit取值为0 - 若当前行
SplitCode非0,取当前Element分组下、相同SplitCode分组中第一行对应的PreSplitClass值
不需要逐行编写复杂的条件偏移、匹配语句,直接利用dplyr的分组计算特性即可快速实现。
实现代码
直接在现有代码的基础上补充分组计算逻辑即可,代码非常简洁:
library(dplyr) data <- data.frame( Element = c("C","B","D","A","A","A","C","B","B","B"), SplitCode = c(0,0,0,0,1,1,0,0,2,2) ) data <- data %>% group_by(Element) %>% mutate(PreSplitClass = row_number()) %>% # 按Element+SplitCode分组,非0组取组内第一个PreSplitClass,0组直接取0 group_by(Element, SplitCode) %>% mutate(ClassAtSplit = if_else(SplitCode == 0, 0, first(PreSplitClass))) %>% ungroup() data
逻辑说明
- 第一层按
Element分组生成PreSplitClass,和原有代码逻辑完全一致 - 第二层按
Element + SplitCode分组,利用first()函数直接取每个非0拆分码分组内的第一个PreSplitClass值,等价于Excel公式中INDEX+MATCH的匹配查找逻辑,效率远高于逐行偏移判断 if_else判断直接将SplitCode为0的行赋值为0,完全匹配Excel公式的前置判断逻辑
运行结果
执行代码后输出结果与示例预期完全一致:
# A tibble: 10 × 4 Element SplitCode PreSplitClass ClassAtSplit <chr> <dbl> <int> <dbl> 1 C 0 1 0 2 B 0 1 0 3 D 0 1 0 4 A 0 1 0 5 A 1 2 2 6 A 1 3 2 7 C 0 2 0 8 B 0 2 0 9 B 2 3 3 10 B 2 4 3
如果后续需要调整逻辑,比如SplitCode为0时也要取对应Element最近一次拆分的PreSplitClass值,只需要把分组判断逻辑替换为分组内的向前/向后填充函数即可,扩展成本很低。
内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072
相关产品推荐
相关产品推荐

