我已经阅读了包含 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’.