You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据DataFrame的Year列提取对应年份的Success值?

问题描述

现有如下DataFrame:

AreaYearSuccess_Year1Success_Year2Success_Year3
61124
72231
333321
441214
232231
533124

希望新增一个独立的Success列,该列的值为每行Year列对应年份的Success_YearN列的值,最终结果如下:

AreaYearSuccess
611
723
3331
4412
2323
5334

尝试过类似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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:56:35