R -将值永久更改为带标签数据中的标签

s4chpxco  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(115)

我曾使用havensjlabelled来尝试使用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)

tjvv9vkg

tjvv9vkg1#

我们可以使用get_labels

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

字符串

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

lnlaulya

lnlaulya2#

当并非所有标签都作为值包含在数据集中时,或者如果所有值都缺失(这可能发生在调查数据中),get_labels(x)[x]方法可能会导致问题。
默认情况下,sjlabelled::read_spss将所有带值标签的原子变量 * 转换为因子。考虑到这些表示带标签的分类变量,将输出变量作为因子返回是有意义的。所有没有值标签的原子变量都被假设为连续变量,并按原样返回。
sjlabelled::copy_labels可用于在删除值和变量标签时返回它们。

library(sjlabelled)

# Create test data
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 variables to normal r factors
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)
  
}

# This approach produces incorrect results / errors
lapply(df[, 2:3], \(x) get_labels(x)[x])
#> $col2
#> [1] "w" "x" "y"
#> 
#> $col3
#> [1] NA NA NA NA

# This approach returns expected results
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

相关问题