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

如何根据min/max年份范围修改DataFrame中年份列的数值?

解决DataFrame年份列按范围赋值的问题

嘿,我来帮你搞定这个需求!你想用dplyr把1997-2010的年份列,在年份处于min和max范围内时设为1,其实用mutate_at(或者新版本的across)就能轻松实现,关键是在匿名函数里获取当前处理的年份列名,再和行内的min/max做比较。

先看示例数据

假设你的DataFrame长这样(我先构造一个示例方便理解):

library(dplyr)

df <- tibble(
  id = 1:3,
  min = c(1999, 2002, 1997),
  max = c(2005, 2008, 2010),
  `1997` = NA, `1998` = NA, `1999` = NA, `2000` = NA,
  `2001` = NA, `2002` = NA, `2003` = NA, `2004` = NA,
  `2005` = NA, `2006` = NA, `2007` = NA, `2008` = NA,
  `2009` = NA, `2010` = NA
)

方法1:用你提到的mutate_at(旧版dplyr适用)

你之前卡在funs()的调用上,其实换成匿名函数(用~开头),结合cur_column()获取当前列名,转成整数后和min/max比较就行:

df_processed <- df %>%
  mutate_at(vars(`1997`:`2010`), 
            ~ ifelse(as.integer(cur_column()) >= min & as.integer(cur_column()) <= max, 1, 0))
  • vars(1997:2010):指定要处理的年份列范围
  • as.integer(cur_column()):把当前列名(比如"1997")转成整数年份,方便和min/max比较
  • ifelse(...):满足范围条件就赋值1,否则赋值0(如果想保留原列的值,把0换成.即可)

方法2:用across(新版dplyr推荐)

如果你的dplyr版本是1.0.0及以上,官方更推荐用across替代mutate_at,写法更直观:

df_processed <- df %>%
  mutate(across(`1997`:`2010`, 
                ~ ifelse(as.integer(cur_column()) >= min & as.integer(cur_column()) <= max, 1, 0)))

注意点

  1. 如果你的年份列名是数值型(比如直接是1997而不是字符串"1997"),可以去掉as.integer(),直接用cur_column()比较
  2. 要是你希望不在范围内的列保留原来的值,把ifelse里的0换成.就可以,.代表原列的原始值

内容的提问来源于stack exchange,提问作者dad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:51:13