如何根据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)))
注意点
- 如果你的年份列名是数值型(比如直接是
1997而不是字符串"1997"),可以去掉as.integer(),直接用cur_column()比较 - 要是你希望不在范围内的列保留原来的值,把
ifelse里的0换成.就可以,.代表原列的原始值
内容的提问来源于stack exchange,提问作者dad
相关产品推荐
相关产品推荐

