R语言中If、else、is.na()自定义函数使用失效求助
问题分析与解决方案
原函数存在的问题
- 列引用错误:函数内直接使用
data$length、data$weight会去查找数据框中名为length/weight的列,但你调用时传入的是L/W,两者不匹配,导致无法正确提取目标列。 - 标量判断不支持向量操作:
if语句只能处理单个逻辑值,而数据框的列是向量类型,无法批量处理所有行的条件判断。 - 返回值不符合需求:原函数仅返回
weight列,而非修改后的完整数据框。
修正方案(两种实现方式)
方式1:基础R实现
无需额外依赖包,用原生R语法处理:
lwr <- function(data, length_col, weight_col, a, b) { # 提取目标列的数值 length_vals <- data[[length_col]] weight_vals <- data[[weight_col]] # 筛选符合条件的行索引:Length非NA且Weight为NA target_idx <- !is.na(length_vals) & is.na(weight_vals) # 对目标行计算Weight值 weight_vals[target_idx] <- 10^(log(a) + b * log(length_vals[target_idx])) # 将更新后的Weight列放回数据框 data[[weight_col]] <- weight_vals # 返回完整数据框 return(data) } # 调用示例(需传入列名字符串) updated_df <- lwr(data=df, length_col = "L", weight_col = "W", a=0.003, b=3.2)
方式2:tidyverse实现(更贴近你的调用习惯)
依赖dplyr包,支持直接传入列名(无需加引号):
library(dplyr) lwr <- function(data, length, weight, a, b) { data %>% mutate( # 使用{{}}实现非标准求值,直接引用传入的列名 {{weight}} := ifelse( !is.na({{length}}) & is.na({{weight}}), 10^(log(a) + b * log({{length}})), {{weight}} ) ) } # 调用示例(和你原来的调用方式一致) updated_df <- lwr(data=df, length = L, weight = W, a=0.003, b=3.2)
验证结果
运行上述代码后,updated_df中符合条件的行(L非NA且W为NA)会被填充计算后的Weight值,其余行保持原样:
print(updated_df) # L W # 1 13 8.738714 # 2 15 12.620684 # 3 19 50.000000 # 4 NA NA # 5 NA NA # 6 32 39.321600 # 7 35 80.000000 # 8 NA NA # 9 NA NA # 10 18 30.000000 # 11 15 12.620684
内容的提问来源于stack exchange,提问作者pomatomus
相关产品推荐
相关产品推荐

