mutate与ud.convert动态交互引发单位转换计算错误问题
ud.convert批量单位转换异常:原因与通用解决方案
问题原因
ud.convert() 函数的第二个参数from仅支持单个字符串单位,无法直接接收向量输入。当你传入列向量diameter_units时,函数只会读取该向量的第一个元素(即示例中的"inches"),并对所有行的数值统一应用英寸转厘米的计算规则,这就导致原本以厘米为单位的数值被错误地乘以2.54。
通用解决方案
不需要用硬编码的ifelse,可以用以下两种更通用的批量处理方式:
方法1:使用rowwise()逐行处理
通过rowwise()让mutate逐行执行转换,确保每一行都匹配对应的单位:
library(dplyr) library(udunits2) fake_data <- tibble::tibble( trial_name = c("Trial_A", "Trial_B", "Trial_C", "Trial_D", "Trial_E", "Trial_F"), diameter = c(2, 5, 3, 7.5, 10, 4.2), diameter_units = c("inches", "centimeters", "inches", "centimeters", "inches", "centimeters") ) fake_data %>% rowwise() %>% mutate(datcm = ud.convert(diameter, diameter_units, 'cm')) %>% ungroup()
方法2:使用purrr::map2()批量映射
利用map2_dbl将数值和对应单位逐个传入ud.convert,实现向量式的批量转换:
library(dplyr) library(udunits2) library(purrr) fake_data %>% mutate(datcm = map2_dbl(diameter, diameter_units, ~ud.convert(.x, .y, 'cm')))
正确输出结果
两种方法都会得到符合预期的转换结果:
trial_name diameter diameter_units datcm <chr> <dbl> <chr> <dbl> 1 Trial_A 2 inches 5.08 2 Trial_B 5 centimeters 5 3 Trial_C 3 inches 7.62 4 Trial_D 7.5 centimeters 7.5 5 Trial_E 10 inches 25.4 6 Trial_F 4.2 centimeters 4.2
内容的提问来源于stack exchange,提问作者Ann Raiho
相关产品推荐
相关产品推荐

