1

我已经阅读了包含 500 多个变量(作为字符)的 CSV 调查。我使用 library(labelled) 为这些变量中的大多数分配变量标签和值标签。然后我将结果传递给 tbl_summary。

见这里: https ://raw.githubusercontent.com/larmarange/labelled/master/cheatsheet/labelled_cheatsheet.pdf

为了分配变量标签和值,我首先通过为每个变量传递一个列表来标记所有变量。接下来,我使用“set_value_labels”为大多数变量添加了值标签。为了给变量添加值标签,我必须确保每个变量都是一个字符。

问题:一旦我标记了所有感兴趣的变量和值,我似乎无法在不删除标签的情况下转换为数字。

这是我正在尝试的一个温和的例子。

以字符串形式读入 CSV 文件:

mtcars2 <- mtcars %>% mutate_if(is.numeric,as.character)

为一些变量分配标签:

var_label(mtcars2) <- list(mpg = "Miles Per Gallon", cyl = "Cylinder", disp = "Displacement")

为某些变量分配值标签:为了使其工作,所有变量都必须是字符(因此我将 CSV 作为字符串读取)。如果没有,我会收到错误: Error: Can't convert `labels` <character> to match type of `x` <double>.

mtcars3 <- mtcars2 %>% set_value_labels(cyl=c(`4`="four",`6`=six,`8`="eight")) %>% haven::as_factor(.)

have::factors(.) 应该保留标签,但它没有(可能是因为我使用不同的包进行了标记?可能是因为这些不是 STATA 标签,而是手动编码的标签?)

mtcars4 <- mtcars3 %>% mutate(mpg = as.numeric(mpg))

在 mtcars3(所有字符串)上运行 tbl_summary,这会保留所有标签及其值(太棒了!),但它不提供我认为是数字的变量的平均值。

 tbl_summary(mtcars3)
    

我将一个变量转换为数字,以便我可以看到平均值,而不是分类。但是现在,标签从我转换为数字的每个变量中消失了。

tbl_summary(mtcars4)

如何在不删除标签属性的情况下将 mtcars3 的一些变量转换为数字?

在我应用之前的实际数据的类 Have::as.factor(.)

> class(survey_clean2$Q51_5)
[1] "haven_labelled" "vctrs_vctr"     "character"

我申请后的数据类别 Have::factor(.)

class(survey_clean2$Q51_5)
[1] "factor"

这是一个带有一些数据的更好示例

data_in <- read_table2("Q50_2     Q50_3  Q85 Q56
1    <NA>      <NA> <NA>
2    <NA>      <NA> <NA>
3    <NA>      <NA> <NA>
<NA>  Rarely Sometimes   12
5    <NA>      <NA> <NA>
6    <NA>      <NA> <NA>
7    <NA>      <NA> <NA>
8    <NA>      <NA> <NA>
9    <NA>      <NA> <NA>
10  Often Sometimes  65")

我们必须将其全部转换为字符,因为这是我处理数据的实际格式。

data_in <- data_nonlab %>% mutate_all(as.character)
str(data_nonlab)

这不适用于数字变量。

tbl_summary(data_in)

所以我将它转换为数字。

data_in_num <- 
data_nonlab %>% mutate(Q50_2 = labelled::labelled(as.numeric(Q50_2), label = attr(Q50_2, "label")))

str(data_in_num)

但是 tbl_summary 输出中省略了该 var,因为:

tbl_summary(data_in_num)
Column(s) ‘Q50_2’ omitted from output.
Accepted classes are ‘character’, ‘factor’, ‘numeric’, ‘logical’, ‘integer’, or ‘difftime’.
4

1 回答 1

2

标记包中有一个很棒的功能可以帮助这些场景:copy_labels_from() https ://larmarange.github.io/labelled/reference/copy_labels.html

您可以使用它在标签被操作剥离后重新应用标签。请参见下面的示例。

library(gtsummary)
library(tidyverse)

# any operation that results in a loss of labels
trial2 <-
  trial %>%
  select(age, marker) %>%
  purrr::map_dfc(as.numeric)

trial2 %>%
  # copy the labels from the original data frame
  labelled::copy_labels_from(trial) %>%
  tbl_summary()

在此处输入图像描述

这是一个基本的 R 解决方案:

library(tidyverse)
library(gtsummary)

mtcars %>% 
  mutate(
    cyl = factor(cyl, levels = c(4, 6, 8), labels = c("four", "six", "eight"))
  ) %>%
  labelled::set_variable_labels(mpg = "Miles Per Gallon", 
                                cyl = "Cylinder", 
                                disp = "Displacement") %>%
  select(mpg, cyl, disp) %>%
  tbl_summary()

在此处输入图像描述

于 2020-09-16T18:03:29.840 回答