如何使用expss::val_lab为数据框多列添加相同值标签
给数据框多列批量添加相同数值标签(expss包)
需求与示例数据
需要使用expss包的标签函数,为数据框中指定的多列添加完全相同的数值标签。示例数据如下:
# 示例数据 ex1 <- c(1,1,2,2,3,3,4,4,5,5) ex2 <- c(5,4,3,2,1,1,2,3,4,5) ex6 <- c(1,2,3,4,5,1,2,3,4,5) df <- data.frame(cbind(ex1, ex2, ex6))
尝试过的无效代码
# 无效代码1:直接传列的列表 val_lab(list(df$ex1, df$ex2, df$ex6)) <- c("Awful"=1, "Bad"=2, "Ok"=3, "Good"=4, "Great"=5) # 无效代码2:传列名字符向量 val_lab(c("ex1","ex2","ex6")) <- c("Awful"=1, "Bad"=2, "Ok"=3, "Good"=4, "Great"=5) # 无效代码3:let函数内用字符向量指定列 let(df,val_lab(c("ex1", "ex2", "ex6")) <- c("Awful"=1, "Bad"=2, "Ok"=3, "Good"=4, "Great"=5)) # 无效代码4:管道结合let的错误写法 df=df %>% let(val_lab(c("ex1", "ex2", "ex6")) <- c("Awful"=1, "Bad"=2, "Ok"=3, "Good"=4, "Great"=5)) df=df %>% let(val_lab(c("ex1", "ex2", "ex6")) := c("Awful"=1, "Bad"=2, "Ok"=3, "Good"=4, "Great"=5))
有效解决方案
方法1:使用lapply批量处理
先定义统一的标签,再通过lapply遍历指定列并赋值:
library(expss) # 定义通用标签 my_labels <- c("Awful"=1, "Bad"=2, "Ok"=3, "Good"=4, "Great"=5) # 批量为指定列添加标签 df[, c("ex1", "ex2", "ex6")] <- lapply(df[, c("ex1", "ex2", "ex6")], function(col) { val_lab(col) <- my_labels col })
方法2:使用expss::let函数(逐个指定列)
如果列数不多,可在let中逐个为列设置标签,语法更贴合expss的风格:
library(expss) my_labels <- c("Awful"=1, "Bad"=2, "Ok"=3, "Good"=4, "Great"=5) df <- let(df, val_lab(ex1) := my_labels, val_lab(ex2) := my_labels, val_lab(ex6) := my_labels )
方法3:for循环遍历列名
用基础R的循环实现批量赋值,逻辑直观:
library(expss) cols_to_label <- c("ex1", "ex2", "ex6") my_labels <- c("Awful"=1, "Bad"=2, "Ok"=3, "Good"=4, "Great"=5) for(col in cols_to_label) { val_lab(df[[col]]) <- my_labels }
无效代码原因说明
val_lab函数仅能作用于单个向量,直接传入列的列表或列名字符向量无法识别let函数内部需要引用数据框的列符号(而非字符串),因此c("ex1", "ex2", "ex6")无法被正确解析
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

