如何在R中实现周度数据模式匹配并生成Unidentified关联Match列
在R中生成周度数据的Match标记列
核心需求
根据Data列的核心字符串(移除Unidentified后缀),判断当前行所在周的过去或未来是否存在对应核心字符串的Unidentified行,存在则标记Match=1,否则为0。
实现步骤
我们使用dplyr包完成数据处理,步骤如下:
- 提取每个
Data条目对应的核心字符串(去掉Unidentified后缀)。 - 按核心字符串分组,记录该组所有
Unidentified行的周数。 - 对每一行,检查当前周是否有过去或未来的
Unidentified行,生成标记。
代码实现
# 加载所需包 library(dplyr) # 构建示例数据 df <- data.frame( Week = 1:16, Data = c( "Red", "Blue Unidentified", "Blue", "Blue", "Green", "Yellow", "Green", "Green Unidentified", "Green", "Yellow", "Red", "Green", "Orange", "Orange", "Orange", "Orange Unidentified" ) ) # 处理生成Match列 df <- df %>% # 提取核心字符串S mutate(S = gsub(" Unidentified$", "", Data)) %>% # 按核心字符串分组 group_by(S) %>% mutate( # 存储当前组内所有Unidentified行的周数 unif_weeks = list(Week[grepl("Unidentified", Data)]), # 检查当前周是否有过去/未来的Unidentified行 Match = as.integer( sapply(Week, function(w) { any(unif_weeks[[1]] < w) || any(unif_weeks[[1]] > w) }) ) ) %>% ungroup() %>% # 移除中间变量 select(-S, -unif_weeks) # 查看结果 print(df)
针对示例标记的调整
如果你的示例标记是基于「仅当Unidentified行与当前行属于同一连续的核心字符串序列」,可以使用以下代码(结合data.table的rleid函数标记连续序列):
library(dplyr) library(data.table) df <- df %>% mutate(S = gsub(" Unidentified$", "", Data)) %>% # 标记连续的核心字符串序列组 mutate(group_id = rleid(S)) %>% # 按连续组分组处理 group_by(group_id) %>% mutate( # 组内是否存在Unidentified行 has_unif = any(grepl("Unidentified", Data)), # 组内非Unidentified行:如果组内有Unidentified则标记1 Match = ifelse(!grepl("Unidentified", Data) & has_unif, 1, 0), # 组内Unidentified行:如果组内有其他非Unidentified行则标记1 Match = ifelse(grepl("Unidentified", Data) & n() > 1, 1, Match) ) %>% ungroup() %>% select(-S, -group_id, -has_unif)
这个版本的结果会完全匹配你提供的示例标记。
内容的提问来源于stack exchange,提问作者ruser123
相关产品推荐
相关产品推荐

