我与
haven
和 sjlabelled
一起尝试使用 sav 文件中包含的数据标签。
这里是一些示例数据(真实数据要大得多,有更多变量、值、标签等,并且所有值都出现多次):
library(sjlabelled)
col1 <- c("a", "b", "c")
col2 <- c(1, 2, 3)
df <- data.frame(col1, col2)
labels <- c("x", "y", "z")
df <- set_labels(df, col2, labels = labels)
我知道我可以使用
as_label
使用标签来操作数据框,使用这些标签进行子集化等。但是,我想用标签替换值,因为某些函数/进程将数据恢复为值并完全删除标签。我无法确定这种情况何时会发生。
使用示例数据,我希望原始数据框最终如下所示,但不定义新的数据框,而是用标签覆盖值:
col1 <- c("a", "b", "c")
col2 <- c("x", "y", "z") # these were the labels but are now the values
df <- data.frame(col1, col2)
我们可以使用
get_labels
df$col2 <- get_labels(df$col2)[df$col2]
-输出
> df
col1 col2
1 a x
2 b y
3 c z
当并非所有标签都作为值包含在数据集中,或者所有值都丢失(这可能发生在调查数据中)时,上述方法可能会导致问题。
sjlabelled::read_spss
默认将所有原子变量转换为因子。鉴于这些代表标记的分类变量,将输出变量作为因子返回是有意义的。
sjlabelled::copy_labels
可用于在删除值和变量标签时返回它们。
library(sjlabelled)
df <- data.frame(
col1 = c("a", "b", "c"),
col2 = c(1, 2, 3),
col3 = c(NA, NA, NA)
)
df <- set_labels(df, col2, col3, labels = c("0" = "w", "1" = "x", "2" = "y", "3" = "z")) |>
var_labels(
col1 = "Var 1",
col2 = "Var 2",
col3 = "var 3"
)
## Function to convert labelled factors to numeric
labels_to_values <- function(x, ...) {
if(!is.null(attr(x, "labels"))) {
x <- factor(x, levels = attr(x, "labels"), labels = names(attr(x, "labels")))
}
return(x)
}
lapply(df[, 2:3], \(x) get_labels(x)[x])
#> $col2
#> [1] "w" "x" "y"
#>
#> $col3
#> [1] NA NA NA NA
df <- lapply(df, labels_to_values) |>
data.frame() |>
copy_labels(df)
df
#> col1 col2 col3
#> 1 a x <NA>
#> 2 b y <NA>
#> 3 c z <NA>
str(df)
#> 'data.frame': 3 obs. of 3 variables:
#> $ col1: chr "a" "b" "c"
#> ..- attr(*, "label")= chr "Var 1"
#> $ col2: Factor w/ 4 levels "w","x","y","z": 2 3 4
#> ..- attr(*, "label")= chr "Var 2"
#> ..- attr(*, "labels")= Named num [1:4] 0 1 2 3
#> .. ..- attr(*, "names")= chr [1:4] "w" "x" "y" "z"
#> $ col3: Factor w/ 4 levels "w","x","y","z": NA NA NA
#> ..- attr(*, "label")= chr "var 3"
#> ..- attr(*, "labels")= Named num [1:4] 0 1 2 3
#> .. ..- attr(*, "names")= chr [1:4] "w" "x" "y" "z"
创建于 2023-10-31,使用 reprex v2.0.2