You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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交叉表结构如下:

namevalueNoUnknownYes
GenderF1(25%)1(25%)2(50%)
GenderM1(25%)1(25%)2(50%)

内容的提问来源于stack exchange,提问作者HSC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:36:02