使用字符 class 变量的变异和重新编码 (dplyr) 后标签丢失

Loss of the label after using mutate and recode (dplyr) of a character class variable

在标记我的数据框变量时,我不得不一次又一次地搜索互联网。对我来说,在 dplyr 的上下文中执行此操作时,这不是一个小问题。

使用 sjlabelled 包中的 set_label 函数,我学会了创建标签向量并将其传递给数据帧的变量。但是后来意想不到的事情发生了。

出于演示目的,我修改了鸢尾花数据集(将 Species 的 class 更改为 character)。 我想知道为什么变量 Species 的标签在 Species as character class (case1) 的情况下消失,而在 Species as factor class 的情况下仍然存在(case 2,在代码中注释掉) - 使用变异和重新编码后。

案例 1(物种=字符 class):

案例 2(物种=因素 class):

library(dplyr)
library(sjlabelled) # set_label function
# vector for variable names
label_names <- c("Length of sepal", "Width of Sepal", "Length of Petal", "Width of Petal", "A lot of Species")

# case 1
# change Species class to character for demonstrating
iris$Species <- as.character(iris$Species)

# case 2
# iris$Species <- as.factor(iris$Species)

iris_new <- iris %>% 
    set_label(label = label_names) %>% 
    mutate(Species = dplyr::recode(Species, 
                                 "setosa" = "setosa_new",
                                 "versicolor" = "versicolorandvirginica", 
                                 "virginica" = "versicolorandvirginica")) 

另外:

如何使用这个简单的代码 label(iris$Species) <- "A lot of Species" 在 dplyr 工作流程中,只需一个变量一个变量地标记。 谢谢!

我认为您发现了一个错误,或者更确切地说是缺乏兼容性。 dplyr::recode 似乎删除了 label 属性。

iris %>% 
    set_label(label = label_names) %>%
    pull(Species) %>% attributes()
#$label
#           Species 
#"A lot of Species"

iris %>% 
  set_label(label = label_names) %>% 
  mutate(Species = dplyr::recode(Species, 
                                 "setosa" = "setosa_new",
                                 "versicolor" = "versicolorandvirginica", 
                                 "virginica" = "versicolorandvirginica")) %>%
  pull(Species) %>% attributes()
#NULL

如果我们查看 dplyr::recodesource,我们发现这是因为对于字符向量,有一个对 as.character 的调用,它删除了属性。同时 factor 方法没有这样的调用。

但要回答你的最后一个问题,set_label 的一个版本旨在重新标记数据框的一列或多列,var_labels:

library(dplyr)
library(sjlabelled)
iris %>% 
  set_label(label = label_names) %>% 
  mutate(Species = dplyr::recode(Species, 
                                 "setosa" = "setosa_new",
                                 "versicolor" = "versicolorandvirginica", 
                                 "virginica" = "versicolorandvirginica")) %>%
  var_labels(Species = "A lot of Species") %>%
  View()