如何阻止sjlabelled在mutate创建新变量时自动继承标签?
用mutate创建带标签变量时自动继承标签的问题解决方法
我在用dplyr的mutate结合sjlabelled的标签变量创建新变量时,发现新变量会自动继承其中一个输入变量的标签,这不是我想要的效果。我不想每次创建新变量都手动设置或移除标签,请问这是bug吗?怎么批量避免这种情况?
library(sjlabelled) library(dplyr) df <- data.frame(aa = c(1), bb = c(2)) %>% var_labels( aa = "label a", bb = "label b") df df <- df %>% mutate(cc = aa + bb) # 我希望避免必须重新设置标签 # df <- df %>% # var_labels( # cc = "")
问题说明
这不是bug,是sjlabelled与dplyr交互时的默认设计:当对带标签的变量执行运算时,新变量会自动继承第一个参与运算变量的标签。
解决方法
全局禁用自动标签继承(推荐,一劳永逸)
设置全局选项后,所有通过mutate创建的新变量都不会自动继承标签:library(sjlabelled) library(dplyr) # 全局关闭自动标签继承 options(sjlabelled.auto_label = FALSE) df <- data.frame(aa = c(1), bb = c(2)) %>% var_labels( aa = "label a", bb = "label b") df <- df %>% mutate(cc = aa + bb, dd = aa * bb) # 此时cc、dd均无继承标签单次操作临时规避
如果不想修改全局设置,可在运算前先移除变量标签或转为普通数值型:# 方法1:移除变量标签后运算 df <- df %>% mutate(cc = remove_labels(aa) + remove_labels(bb)) # 方法2:转为普通数值型后运算 df <- df %>% mutate(cc = as.numeric(aa) + as.numeric(bb))批量清除已生成的继承标签
若已经创建了带继承标签的新变量,可批量清除:# 清除指定变量(如cc)的标签 df <- df %>% remove_var_labels(cc) # 清除所有变量的标签(按需使用) df <- df %>% remove_var_labels()
内容的提问来源于stack exchange,提问作者user63230
相关产品推荐
相关产品推荐

