R语言中如何根据列条件与另一列值转换身高单位并修复代码报错问题
解决身高单位转换的问题
嘿,我来帮你梳理下这个问题~首先得指出你原来代码里的几个问题,然后给你更简洁高效的解决方案:
你原有代码的问题
- 变量名不匹配:你的原始数据框是
complete_file,但代码里用了vital_signs_clean;另外subject_id应该是subject,Height_Units是height_unit,这些变量名错误会导致R找不到对应数据。 - 语法逻辑错误:
if(n_distinct(Height_Units == "inches", na.rm = TRUE) == 1), *2.54)这段写法完全不对——if语句缺少else分支,而且n_distinct在这里完全没必要,我们需要的是逐行判断每个记录的单位是不是英寸,不是分组内的去重统计。 - 多余的分组:转换身高是逐行独立的操作,不需要按
subject分组,group_by在这里反而会增加不必要的计算。
推荐的解决方案
方法1:用dplyr的if_else(最简洁高效)
这是向量化的操作,比循环快很多,适合处理数据框:
library(dplyr) # 只转换身高数值 complete_file_clean <- complete_file %>% mutate(height = if_else(height_unit == "inches", height * 2.54, height))
如果想同时把单位统一成cm,可以再加一行:
complete_file_clean <- complete_file %>% mutate( height = if_else(height_unit == "inches", height * 2.54, height), height_unit = if_else(height_unit == "inches", "cm", height_unit) )
方法2:用case_when(适合未来扩展更多单位)
如果以后需要处理更多单位(比如英尺、米),case_when会更灵活:
complete_file_clean <- complete_file %>% mutate(height = case_when( height_unit == "inches" ~ height * 2.54, # 可以在这里加更多单位转换规则 TRUE ~ height # 其他情况保持原数值 ))
方法3:基础R实现(不用dplyr)
如果你不想加载dplyr包,用基础R的索引操作也能搞定:
complete_file_clean <- complete_file # 筛选出单位是inches的行,把对应height乘以2.54 complete_file_clean$height[complete_file_clean$height_unit == "inches"] <- complete_file_clean$height[complete_file_clean$height_unit == "inches"] * 2.54
这些方法都能准确完成你的需求,而且逻辑清晰、运行高效~
内容的提问来源于stack exchange,提问作者osu-statistics
相关产品推荐
相关产品推荐

