R tidyverse自定义问卷交叉表生成函数object not found报错修复求助
R tidyverse 交叉表自定义函数报错修复方案
报错翻译
原英文报错:Error in paste0(x): object 'q1' not found
中文翻译:执行paste0(x)时出错:找不到名为'q1'的对象
报错根因
- tidyverse采用非标准求值机制,直接向自定义函数传入裸列名(不带引号的q1/q2)时,函数会优先在全局环境搜索对应名称的变量,不会自动识别为传入数据框的列名,因此触发找不到对象的报错。
- 原有函数存在列名拼写错误:示例数据中性别列名为大写开头的
Gender,函数内写为小写gender,会导致选列时索引失败。 - 原有函数最终返回值为列名向量,无法输出交叉表结果,不符合需求。
修复后的完整代码
library(tidyverse) # 构造示例数据框 a <- c(2000,2000,2000,2000,2001,2001,2001,2001) b <- c("M","M","M","F","F","M","F","F") d<- c("Yes","No","Yes","No","No","Unknown","Unknown","Yes") e <- c("Unknown","No","No","Yes","Unknown","Yes","No","Unknown") df <- data.frame(a,b,d,e) colnames(df) <- c("Year","Gender","q1","q2") # 修复后的交叉表生成函数 maketable <- function(df, x){ # 用{{}}处理tidyverse非标准求值,识别裸列名 mydf <- df %>% select(Gender, {{x}}) table1 <- mydf %>% pivot_longer(-{{x}}) %>% group_by(name, {{x}}, value) %>% summarise(n = n(), .groups = "drop") %>% group_by(name, value) %>% mutate(prop = round(n/sum(n), 3)*100, summary_str = glue::glue("{n}({prop}%)")) %>% pivot_wider(id_cols = c(name, value), names_from = {{x}}, values_from = "summary_str") # 返回交叉表结果 return(table1) } # 测试调用 maketable(df, q1) maketable(df, q2)
调用效果示例(以q1为例)
输出的q1交叉表结构如下:
| name | value | No | Unknown | Yes |
|---|---|---|---|---|
| Gender | F | 1(25%) | 1(25%) | 2(50%) |
| Gender | M | 1(25%) | 1(25%) | 2(50%) |
内容的提问来源于stack exchange,提问作者HSC
相关产品推荐
相关产品推荐

