使用函数更改列标签

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

我有一个 R 数据框,其中有来自 RedCAP 调查导出的许多列。许多列都有相应的因子列,并且它们标有“.factor”后缀。非因素列具有带有调查项目文本的标签属性;该列的因子版本没有标签。

我想自动从非因子列中获取标签属性,并使用函数将其设置为因子列上的标签属性。我已经完成了这样的事情:

library(tidyverse)
my_data <- tibble(x = 1, x.factor = 1, y = 3, y.factor = 3)
attr(my_data$x, "label") <- "the x factor"
attr(my_data$y, "label") <- "the y factor"


set_factor_labels <- function(factor_variable){
  non_factor_var <- str_remove(factor_variable, ".factor")
  label <- attr(my_data[[non_factor_var]], "label")
  attr(my_data[[factor_variable]], "label") <- label
  return(my_data)
}

factor_columns <- str_subset(colnames(my_data), ".factor")

my_data <- map(factor_columns, set_factor_labels) 

于 2024 年 10 月 18 日使用 reprex v2.1.1 创建

但这不太正确——我认为我需要

map
以外的东西,或者我需要修改函数返回的内容。我很感激任何指点。

r function attr
1个回答
0
投票

而不是

map
,请尝试以下函数,该函数迭代包含“标签”属性的变量向量,然后设置要修改的相应变量的“标签”属性。

set_factor_labels <- function(data) {

  labels <- sapply(my_data, attr, which="label")
  vars <- names(which(sapply(data, \(x) length(attr(x, which="label")))!=0))

  for(var in vars) {
    attr(data[[paste0(var, ".factor")]], "label") <- labels[[var]]
    attr(data[[var]], "label") <- NULL # optional
  }
  
  return(data) # or data
}

my_data2 <- set_factor_labels(my_data)

str(my_data2)

给予

tibble [1 × 4] (S3: tbl_df/tbl/data.frame)
 $ x       : num 1
 $ x.factor: num 1
  ..- attr(*, "label")= chr "the x factor"
 $ y       : num 3
 $ y.factor: num 3
  ..- attr(*, "label")= chr "the y factor"
© www.soinside.com 2019 - 2024. All rights reserved.