如何在R expss中指定行标签,避免以get(varname)作为标签?
如何移除expss透视表行标签中的
get(varname)|前缀? 我尝试通过循环处理一组有命名模式的变量来生成透视表,代码如下:
# Loop through variables tables <- list() pattern <- "aa_bb_cc" for (i in c(1:6)) { varname <-paste0(pattern,i) caption <- attributes(df)$variable.labels[varname] # Create table for current variable table <- df %>% tab_cells(get(varname)) %>% tab_total_row_position(total_row_position = "none") %>% tab_cols(total(),s_Sex) %>% # tab_stat_cases() %>% tab_stat_cpct() %>% tab_pivot()%>% tab_caption(caption) tables[[i]] <- table }
运行后生成的表格行标签带有get(varname)|前缀,示例如下:
tables[[1]]$row_labels
输出:
[1] "get(varname)|Trifft voll und ganz zu" "get(varname)|Trifft eher zu" [3] "get(varname)|Weder - noch" "get(varname)|Trifft eher nicht zu" [5] "get(varname)|Trifft überhaupt nicht zu"
我希望仅保留原始选项文本,试过var_lab、tab_row_label都无效,想知道是否有tab_*系列函数可以关闭这种拼接,或者其他解决思路。
解决思路
问题根源在于get(varname)的调用方式——expss会将get()的表达式作为变量标识拼接到行标签前。改用符号求值直接引用变量,就能避免这个问题。
修改后的核心代码
将tab_cells(get(varname))替换为tab_cells(!!sym(varname)),完整代码如下:
tables <- list() pattern <- "aa_bb_cc" for (i in c(1:6)) { varname <- paste0(pattern, i) caption <- attributes(df)$variable.labels[varname] table <- df %>% tab_cells(!!sym(varname)) %>% # 替换为符号求值方式 tab_total_row_position(total_row_position = "none") %>% tab_cols(total(), s_Sex) %>% tab_stat_cpct() %>% tab_pivot() %>% tab_caption(caption) tables[[i]] <- table }
原理说明
sym(varname)将字符串格式的变量名转换为R的符号对象,等效于直接写出变量名!!(双感叹号运算符)会“解引用”符号对象,让expss识别为原始变量而非函数调用,因此不会生成get(varname)|前缀
备选手动修复方案
如果无法修改tab_cells的调用逻辑,可以在生成表格后通过正则表达式清理行标签:
# 在循环内生成表格后添加这一行 tables[[i]]$row_labels <- gsub("^get\\(varname\\)\\|", "", tables[[i]]$row_labels)
此方法直接移除行标签开头的get(varname)|部分,适合快速临时修复,但符号求值的方式更简洁优雅。
内容的提问来源于stack exchange,提问作者S.Z
相关产品推荐
相关产品推荐

