我有一个 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
以外的东西,或者我需要修改函数返回的内容。我很感激任何指点。
而不是
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"