R - 在标记数据中永久更改标签值

问题描述 投票:0回答:2

我与

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)
r label spss r-haven
2个回答
4
投票

我们可以使用

get_labels

df$col2 <- get_labels(df$col2)[df$col2]

-输出

> df
  col1 col2
1    a    x
2    b    y
3    c    z

0
投票

当并非所有标签都作为值包含在数据集中,或者所有值都丢失(这可能发生在调查数据中)时,上述方法可能会导致问题。

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

© www.soinside.com 2019 - 2024. All rights reserved.