基于另一列未知数值自动生成因子列的R语言实现需求
自动将Region_ID映射为BNR序列因子列的解决方案
问题场景
现有R脚本通过case_when手动将Region_ID的固定值映射为BNR1/BNR2/BNR3,但Region_ID的数值是随机生成的,每次运行都需要手动修改映射规则,无法自动适配不同的Region_ID取值。
原核心映射代码片段:
mutate(BNR = case_when( Region_ID == 10 ~ "BNR1", Region_ID == 13 ~ "BNR2", Region_ID == 15 ~ "BNR3", TRUE ~ as.character(Region_ID)))
解决方案
可以通过将Region_ID转换为因子后提取整数编码,再拼接前缀的方式实现自动映射,无需手动指定每个Region_ID的对应关系。
方法1:按数据中首次出现顺序生成BNR序列
Dai3D_evening_allBNR <- list.files( path = 'Z:/fishproj/Cambodia Dai project/Analytic/Flux/River_Width/Dai3C', pattern = "^Dai3D_ABC_10mbin_20211209_fullwatercolumn_evening_BNR*.*csv", full.names = TRUE ) %>% map_dfr(read_csv) %>% mutate( # 保留Region_ID在数据中首次出现的顺序生成序列 BNR = paste0("BNR", as.integer(fct_inorder(factor(Region_ID)))) )
方法2:按Region_ID数值大小顺序生成BNR序列
如果需要按Region_ID的数值排序来生成序列,去掉fct_inorder即可:
Dai3D_evening_allBNR <- list.files( path = 'Z:/fishproj/Cambodia Dai project/Analytic/Flux/River_Width/Dai3C', pattern = "^Dai3D_ABC_10mbin_20211209_fullwatercolumn_evening_BNR*.*csv", full.names = TRUE ) %>% map_dfr(read_csv) %>% mutate( # 按Region_ID的数值从小到大生成序列 BNR = paste0("BNR", as.integer(factor(Region_ID))) )
方法3:结合分组操作生成序列(适合复杂场景)
如果需要配合分组逻辑,可通过group_by+cur_group_id()实现:
Dai3D_evening_allBNR <- list.files( path = 'Z:/fishproj/Cambodia Dai project/Analytic/Flux/River_Width/Dai3C', pattern = "^Dai3D_ABC_10mbin_20211209_fullwatercolumn_evening_BNR*.*csv", full.names = TRUE ) %>% map_dfr(read_csv) %>% group_by(Region_ID) %>% mutate(BNR = paste0("BNR", cur_group_id())) %>% ungroup()
效果验证
假设新的Region_ID取值为22、35、41,运行代码后会自动生成如下结果:
Region_ID Sv_mean BNR 1 22 -64.01115 BNR1 2 22 -64.96363 BNR1 3 35 -67.98841 BNR2 4 35 -66.88734 BNR2 5 41 -69.79789 BNR3 6 41 -69.94071 BNR3
内容的提问来源于stack exchange,提问作者Jackson A Swan
相关产品推荐
相关产品推荐

