如何用mutate和ifelse按条件计算花卉面积列?
解决方案
你的问题核心在于原始数据列是字符型,其中的"NA"字符串并不是R真正识别的缺失值(NA),导致is.na()判断失效。先修正数据类型,再用条件逻辑计算即可。
步骤1:转换数据类型
先把所有字符型的数值列转为数值型,自动将"NA"字符串转为R认可的缺失值NA:
library(dplyr) # 转换数据列类型 df <- df %>% mutate(across(c(inflorescence_mm, flower_mm, corolla_mm, count), as.numeric))
步骤2:计算面积列
方法1:嵌套ifelse实现优先级判断
完全按照你的规则,用嵌套ifelse依次判断:
df <- df %>% mutate(flower_area_mm2 = ifelse( !is.na(inflorescence_mm), (0.5 * inflorescence_mm)^2 * pi * count, ifelse( !is.na(flower_mm), (0.5 * flower_mm)^2 * pi * count, (0.5 * corolla_mm)^2 * pi * count ) ))
方法2:用coalesce简化代码(更简洁)
coalesce函数会按顺序返回第一个非缺失值,适合这种优先级取值场景:
df <- df %>% mutate( # 按优先级选取可用的尺寸值 selected_size = coalesce(inflorescence_mm, flower_mm, corolla_mm), # 统一计算面积 flower_area_mm2 = (0.5 * selected_size)^2 * pi * count ) %>% # 可选:删除中间辅助列 select(-selected_size)
最终结果
运行后df会新增flower_area_mm2列,对应每行的计算结果:
| inflorescence_mm | flower_mm | corolla_mm | count | flower_area_mm2 |
|---|---|---|---|---|
| 5 | NA | NA | 100 | 1963.495 |
| NA | NA | 2 | 75 | 235.6194 |
| NA | 3 | NA | 80 | 565.4867 |
内容的提问来源于stack exchange,提问作者KNieder
相关产品推荐
相关产品推荐

