如何在R中标记is_seq_end为yes后的首个Pass/Take on类型行
需求:标记足球赛事序列起始行
需要在足球赛事事件的DataFrame中,找到并标记所有is_seq_end字段值为"yes"的事件之后,首次出现的类型为"Pass"或"Take on"的行,新增字段is_seq_start,符合条件的标记为"yes",其余为"no"。
原始数据
数据表格
| id | type | is_seq_end |
|---|---|---|
| 1 | Dispossessed | yes |
| 2 | Defensive | no |
| 3 | Other | no |
| 4 | Defensive | no |
| 5 | Pass | no |
| 6 | Pass | no |
| 7 | Dispossessed | yes |
| 8 | Defensive | no |
| 9 | Other | no |
| 10 | Take on | no |
R数据结构
df <- structure(list(id = 1:10, type = c("Dispossessed", "Defensive", "Other", "Defensive", "Pass", "Pass", "Dispossessed", "Defensive", "Other", "Take on"), is_seq_end = c("yes", "no", "no", "no", "no", "no", "yes", "no", "no", "no")), class = "data.frame", row.names = c(NA, -10L))
解决方案(R语言)
使用dplyr包实现分组筛选,定位每个is_seq_end="yes"之后的首个目标行:
library(dplyr) df <- df %>% # 按is_seq_end="yes"划分分组 mutate(seq_group = cumsum(is_seq_end == "yes")) %>% group_by(seq_group) %>% # 标记组内第一个符合type条件的行 mutate(is_seq_start = case_when( row_number() == which(type %in% c("Pass", "Take on"))[1] ~ "yes", TRUE ~ "no" )) %>% ungroup() %>% select(-seq_group) # 处理无符合条件行的分组(示例中无此情况) df$is_seq_start[is.na(df$is_seq_start)] <- "no"
最终结果
| id | type | is_seq_end | is_seq_start |
|---|---|---|---|
| 1 | Dispossessed | yes | no |
| 2 | Defensive | no | no |
| 3 | Other | no | no |
| 4 | Defensive | no | no |
| 5 | Pass | no | yes |
| 6 | Pass | no | no |
| 7 | Dispossessed | yes | no |
| 8 | Defensive | no | no |
| 9 | Other | no | no |
| 10 | Take on | no | yes |
内容的提问来源于stack exchange,提问作者Delopera
相关产品推荐
相关产品推荐

