假设我有以下tibble由tibblehaven包制作:

library(tibble)
library(haven)

# Create numerical values
values <- c(1:5)

# Combine values and colors into a named vector
color_choices <- setNames(values, c("Don't know", "Red", "Blue", "Green", "Yellow"))
name_choices <- setNames(values, c("Don't know", "John", "Paul", "Ringo", "George"))

# Create a tibble with the labelled column
data <- tibble(respondent_ID = seq(1:10),
               colour_choice = labelled(sample(1:5, 10, replace = TRUE), labels = color_choices),
               name_choice  = labelled(sample(1:5, 10, replace = TRUE), labels = name_choices))

data

现在我想改变一些变量的haven标签.具体地说,我只想把value = 1的标签从"Don't know"改为"Not sure",但我想跨多个变量这样做.

这就达到了我想要的colour_choice变量的结果:

data_replaced <- data
color_choices2 <- color_choices

names(color_choices2)[1] <- "Not sure"
val_labels(data_replaced$colour_choice) <- color_choices2

然而,由于两个原因,这是繁琐的;首先,即使是一个变量,它也是低效的,因为它涉及到为变量中的所有标签创建一个新的命名向量,而只有一个标签需要替换.[val_labels(data_replaced$colour_choice) <- c("Not sure" = 1)导致其他标签被删除].第二,它绝对没有可扩展性.

我一直在try 一个dhrr方法(这将是更好的反正)使用memisc::relabel功能,但不断击中墙壁,我想知道是否有人可以提出一个建议?这就是我在的位置:

data_replaced <- data %>%
  mutate_at(vars(colour_choice, name_choice), ~ memisc::relabel(., "Don't know" = "Not sure"))

推荐答案

你可以使用labelled:val_label<-创建一个辅助函数,然后在mutate(across())中调用它:

library(dplyr)
library(labelled)
set.seed(13) # for OP's sample data

change_value_label <- function(x, value, new_label) {
  val_label(x, value) <- new_label
  x
}

data %>% 
  mutate(across(
    colour_choice:name_choice, 
    \(x) change_value_label(x, 1, "Not sure")
  ))

# # A tibble: 10 × 3
#    respondent_ID colour_choice name_choice 
#            <int> <int+lbl>     <int+lbl>   
#  1             1 3 [Blue]      5 [George]  
#  2             2 5 [Yellow]    4 [Ringo]   
#  3             3 2 [Red]       1 [Not sure]
#  4             4 5 [Yellow]    5 [George]  
#  5             5 4 [Green]     1 [Not sure]
#  6             6 5 [Yellow]    4 [Ringo]   
#  7             7 4 [Green]     1 [Not sure]
#  8             8 3 [Blue]      3 [Paul]    
#  9             9 1 [Not sure]  4 [Ringo]   
# 10            10 2 [Red]       5 [George]  

您可以调整函数,使其接受要更改的标签而不是值(例如,swap_value_label(x, "Don't know", "Not sure")).这还有一个额外的好处,那就是即使要更改的标签在不同变量之间没有一致的值.

swap_value_label <- function(x, old_label, new_label) {
  value <- val_labels(x)[[old_label]]
  val_label(x, value) <- new_label
  x
}

R相关问答推荐

如何在R中正确对齐放射状图中的文本

判断字符串中数字的连续性

根据模式将一列拆分为多列,并在R中进行拆分

在组中添加值增加和减少的行

如何在Chart_Series()中更改轴值的 colored颜色 ?

在R中无法读入具有Readxl和lApply的数据集

多个过滤器内的一个盒子在仪表板Quarto

矩阵的堆叠条形图,条形图上有数字作为标签

ComplexHEAT:使用COLUMN_SPLIT时忽略COLUMN_ORDER

如何在R库GoogleDrive中完全删除预先授权的Google帐户?

根据1个变量绘制 colored颜色 发散的 map ,由另一个变量绘制饱和度,ggplot2不工作

为左表中的所有行使用值Fill滚动左连接

将向量元素重新排序为R中的第二个

R中的类别比较

主题(Legend.key=Element_RECT(Fill=&Quot;White&Quot;))不起作用

ArrangeGrob()和类似的替代方法不接受Grob列表.在Grid.Draw,返回:glist中的错误(...):仅允许在glist";中使用Grobs;

使用函数从R中的列中删除标高

roxygen2正在处理太多的文件

使用点图调整离散轴比例

用LOOCV进行K近邻问题