R语言自定义函数中如何正确向mean()传递字符串格式列名参数
问题场景
现有测试数据集构造代码如下:
toy <- cbind(ID = c(1:10), group1 = sample(1:3, 10, replace = TRUE), group2 = sample(1:3, 10, replace = TRUE), value = rnorm(1:10))
数据集样例结构:
ID group1 group2 value [1,] 1 1 2 -0.32903883 [2,] 2 3 3 0.06923648 [3,] 3 1 1 0.09690423 [4,] 4 1 3 0.29003439 [5,] 5 3 2 -0.74667894 [6,] 6 1 2 -0.84689639 [7,] 7 3 3 1.19707766 [8,] 8 1 3 -0.54862736 [9,] 9 2 2 0.30304570 [10,] 10 1 3 -0.05697053
需要编写包含dataset、focal.var两个参数的自定义函数:接收数据框输入,按group1字段分组,计算focal.var指定列的分组均值。
初始编写的错误代码如下:
focal <- function(dataset, focal.var){ df <- dataset %>% group_by(group1) %>% mutate(FV_ft = mean(focal.var)) return(df) }
调用方式:
focal(dataset = toy, focal.var = "value")
运行报错:
argument is not numeric or logical: returning NA
错误原因
cbind()默认生成的是矩阵类型,dplyr的分组操作要求输入是数据框/tibble格式,直接传矩阵会存在类型兼容问题。- 核心问题是dplyr默认使用非标准求值,直接把字符串形式的列名
"value"传给mean()时,函数拿到的是字符串本身,不是数据框中对应列的数值向量,因此触发类型错误。
修正代码
使用dplyr内置的.data代词指代传入数据集,通过双括号索引字符串形式的列名即可,同时提前将输入转为数据框格式:
library(dplyr) focal <- function(dataset, focal.var){ df <- as.data.frame(dataset) %>% group_by(group1) %>% mutate(FV_ft = mean(.data[[focal.var]])) %>% ungroup() return(df) }
调用测试:
result <- focal(dataset = toy, focal.var = "value") print(result)
运行后会在原数据基础上新增FV_ft列,存储对应group1分组下value列的均值,无报错。
如果后续需要支持传入裸列名(比如
focal(toy, value)这种不带引号的传参方式),可以通过ensym()做参数转换,上述写法已经完全匹配当前传字符串列名的调用需求。
内容的提问来源于stack exchange,提问作者Pie-ton
相关产品推荐
相关产品推荐

