如何在R语言中将列名传入自定义离群值查询函数?
解决R函数传入列名查找离群值的问题
你的代码存在两个关键问题,导致无法得到预期结果,下面是修正方案:
核心问题分析
- 函数调用错误:调用
find_outliers时缺少第一个必填参数my_data,且列名需要以字符串形式传入(或通过非标准求值处理)。 - 列索引方式错误:
my_data$colname是按字面量查找名为colname的列,而非使用变量colname的值去匹配列,必须改用[[ ]]运算符实现变量索引。
基础版修正代码(字符串传参)
my_data= data.frame( sex= c("f", "m", "f", "f", "m"), age= c(22, 30, 24, 27, 30), eduyears= c(12,16, 15, 12, 17), weight= c(53, 70, 60, 110, 75), height= c(160, 183, 157, 168, 180)) find_outliers= function (my_data, colname) { # 使用[[ ]]引用变量指定的目标列 out_values= boxplot.stats(my_data[[colname]])$out # 匹配离群值所在行的索引 out_ind= which(my_data[[colname]] %in% out_values) # 提取指定列的离群值相关信息 outliers= my_data[out_ind ,c("sex","age","eduyears", colname)] return (outliers) } # 调用时传入数据集和字符串形式的列名 find_outliers(my_data, "weight")
运行后会返回预期结果:
sex age eduyears weight 4 f 27 12 110
进阶版(支持无引号传参)
如果希望像使用dplyr语法一样不用引号传列名,可以通过substitute()和deparse()处理非标准求值:
find_outliers= function (my_data, colname) { # 将传入的列名表达式转为字符串 colname <- deparse(substitute(colname)) out_values= boxplot.stats(my_data[[colname]])$out out_ind= which(my_data[[colname]] %in% out_values) outliers= my_data[out_ind ,c("sex","age","eduyears", colname)] return (outliers) } # 无需加引号直接传入列名 find_outliers(my_data, weight)
内容的提问来源于stack exchange,提问作者maya zadok
相关产品推荐
相关产品推荐

