R语言中自定义Friedman检验函数传递列名报错问题
问题描述
我有一段可正常运行的实验数据分析代码:
# Load Data data <- read.csv("./HHT/Processed_Data/data_.csv") data %>% group_by(Round) %>% get_summary_stats(Q1.1, type="mean_sd") # Friedman Test res.fried <- friedman.test(y = data$Q1.1, groups = data$Round, blocks = data$P_ID)
为了快速更换y值执行相同检验,我编写了以下函数:
friedman <- function(column) { res <- friedman.test(y = data$column, groups = data$Round, blocks = data$P_ID) return(res) } friedman(Q1.1)
但调用函数时出现错误:
Error in friedman.test.default(y = data$column, groups = data$Round, blocks = data$P_ID) : 'y', 'groups' and 'blocks' must have the same length
错误原因
data$column的写法是错误的:当你用$索引数据框列时,R会把column当成字面列名去查找,而不是你传入的参数值。你的数据框里并没有名为column的列,所以data$column返回的是NULL,长度为0,自然和groups、blocks的长度不匹配,触发错误。
解决方案
提供两种常用的解决方式,按需选择:
方式1:使用字符串传参 + [[ ]]索引
修改函数,用[[ ]]来动态获取列([[ ]]支持变量作为索引),调用时传入列名的字符串:
friedman <- function(column) { res <- friedman.test(y = data[[column]], groups = data$Round, blocks = data$P_ID) return(res) } # 调用时传字符串 friedman("Q1.1")
方式2:支持裸变量名(非标准求值)
如果你希望保持friedman(Q1.1)的调用方式(不用加引号),可以用tidyverse的非标准求值工具处理:
library(dplyr) friedman <- function(column) { # 将裸变量名转为引用 column_enquo <- enquo(column) # 取出对应列的值 y_val <- data %>% pull(!!column_enquo) res <- friedman.test(y = y_val, groups = data$Round, blocks = data$P_ID) return(res) } # 直接传裸列名调用 friedman(Q1.1)
内容的提问来源于stack exchange,提问作者kannally
相关产品推荐
相关产品推荐

