R语言dplyr包mutate函数修改列值失败问题求助
问题诊断与解决方法
原代码问题分析
你的代码里if_else(Parameter == grepl('ANT_L', Parameter), ...)这一行存在核心逻辑错误:
grepl('ANT_L', Parameter)会返回一个布尔向量(每个元素对应Parameter列是否包含ANT_L,值为TRUE/FALSE)- 把字符串类型的
Parameter列和布尔值直接比较,会触发类型不匹配的隐式转换,最终得到全FALSE的结果,导致if_else永远不会执行替换操作,Activity列自然不会发生预期变化。
正确实现方式
针对你的需求(两种匹配规则),使用dplyr::case_when会比嵌套if_else更清晰易读,适合多条件场景:
library(dplyr) dataADstudies_1639_5cols <- dataADstudies_1639_5cols_2D %>% mutate(Activity = case_when( grepl('ANT_L', Parameter) ~ "Phot_Ant_TL", grepl('ANT_NL', Parameter) ~ "Phot_Ant_NL", TRUE ~ Activity # 其他未匹配的情况保持原Activity值 ))
如果更习惯使用if_else,可以写成嵌套形式:
dataADstudies_1639_5cols <- dataADstudies_1639_5cols_2D %>% mutate(Activity = if_else( grepl('ANT_L', Parameter), "Phot_Ant_TL", if_else( grepl('ANT_NL', Parameter), "Phot_Ant_NL", Activity ) ))
验证结果
用你提供的测试数据运行上述代码后,会得到完全符合预期的结果:
Nr Section Activity Parameter Value 44 1639_1 Day 0 Phot_Ant_TL ANT_L_Ery 18.932 45 1639_1 Day 0 Phot_Ant_TL ANT_L_EryRat 1.189 46 1639_1 Day 0 Phot_Ant_TL ANT_L_Rough 9.552 47 1639_1 Day 0 Phot_Ant_NL ANT_NL_Ery 0.583 48 1639_1 Day 0 Phot_Ant_NL ANT_NL_EryRa 0.886 49 1639_1 Day 0 Phot_Ant_NL ANT_NL_Rough 3.958
内容的提问来源于stack exchange,提问作者tevk
相关产品推荐
相关产品推荐

