如何根据DataFrame的Year列提取对应年份的Success值?
问题描述
现有如下DataFrame:
| Area | Year | Success_Year1 | Success_Year2 | Success_Year3 |
|---|---|---|---|---|
| 6 | 1 | 1 | 2 | 4 |
| 7 | 2 | 2 | 3 | 1 |
| 33 | 3 | 3 | 2 | 1 |
| 44 | 1 | 2 | 1 | 4 |
| 23 | 2 | 2 | 3 | 1 |
| 53 | 3 | 1 | 2 | 4 |
希望新增一个独立的Success列,该列的值为每行Year列对应年份的Success_YearN列的值,最终结果如下:
| Area | Year | Success |
|---|---|---|
| 6 | 1 | 1 |
| 7 | 2 | 3 |
| 33 | 3 | 1 |
| 44 | 1 | 2 |
| 23 | 2 | 3 |
| 53 | 3 | 4 |
尝试过类似data_match <- data[ , grep("col", colnames(data))]的代码,但无法实现逐行匹配,询问该如何实现,用join还是条件选择?
解决方案
方法1:基础R逐行匹配
利用每行的Year值拼接目标列名,再通过行列索引提取对应值:
# 假设你的数据框名为df target_cols <- paste0("Success_Year", df$Year) df$Success <- df[cbind(seq(nrow(df)), match(target_cols, colnames(df)))]
方法2:tidyverse重塑数据(更直观)
通过将宽表转为长表,筛选出与Year匹配的行,再整理成目标格式:
library(tidyverse) df_result <- df %>% # 将Success_Year开头的列转为长格式 pivot_longer(cols = starts_with("Success_Year"), names_to = "Year_col", values_to = "Success") %>% # 提取Year_col中的数字并转为整数 mutate(Year_col = str_extract(Year_col, "\\d+") %>% as.integer()) %>% # 筛选年份匹配的行 filter(Year_col == Year) %>% # 保留需要的列 select(Area, Year, Success)
方法3:固定年份的条件选择
如果年份只有1、2、3这三种固定值,直接用嵌套ifelse快速实现:
df$Success <- ifelse(df$Year == 1, df$Success_Year1, ifelse(df$Year == 2, df$Success_Year2, df$Success_Year3))
内容的提问来源于stack exchange,提问作者Boterkoekpje
相关产品推荐
相关产品推荐

