在有序分组中查找modality上一次出现的索引(基于dplyr实现)
用dplyr实现同组内上一次small的索引记录
嘿,这个需求用dplyr完全能轻松搞定,我给你一步步拆解,再配上示例代码方便你理解~
核心思路
我们需要在每组内完成两个关键操作:
- 标记出所有
modality == "small"的行的索引 - 将这些索引向下填充到后续的非small行,让每一行都能拿到上一次出现small的索引
示例代码与步骤
1. 先构造示例数据(模拟你的业务数据)
library(dplyr) library(tidyr) # 用到fill函数来填充NA # 模拟包含"猴子"组的示例数据 df <- tibble( group = rep(c("猴子", "熊猫"), each = 5), time = rep(1:5, 2), # 按时间排序的字段 modality = c("small", "large", "small", "large", "large", "small", "large", "large", "small", "large") )
2. 处理逻辑实现
df_processed <- df %>% # 先确保每组严格按时间排序(虽然你说已经排好,加这步更稳妥) arrange(group, time) %>% # 按group分组处理 group_by(group) %>% # 第一步:标记small行的索引(这里用组内行号,若有全局索引可替换成你的索引列) mutate( last_small_index = ifelse(modality == "small", row_number(), NA) ) %>% # 第二步:向下填充NA,让非small行继承上一次small的索引 fill(last_small_index, .direction = "down") %>% # 取消分组,回到全局数据框 ungroup()
3. 查看处理结果
print(df_processed)
输出结果如下:
# A tibble: 10 × 4 group time modality last_small_index <chr> <int> <chr> <int> 1 猴子 1 small 1 2 猴子 2 large 1 3 猴子 3 small 3 4 猴子 4 large 3 5 猴子 5 large 3 6 熊猫 1 small 1 7 熊猫 2 large 1 8 熊猫 3 large 1 9 熊猫 4 small 4 10 熊猫 5 large 4
额外说明
- 如果你的数据有全局唯一索引列(比如命名为
id),只需要把代码里的row_number()替换成id,这样得到的就是全局的索引值,而不是组内的行号。 - 每组开头的small行,
last_small_index会指向自身,这完全符合需求——因为这是组内第一次出现small,上一次就是它自己。
内容的提问来源于stack exchange,提问作者user189035
相关产品推荐
相关产品推荐

