在 R 中使用变量标签重命名变量

spi*_*tor 2 r labelled

我一直与 SPSS 和 STata 的合作者一起工作,因此清晰的变量标签对于传达对任何给定变量所做的操作及其记录的内容非常重要。

如何在 tidyverse 上下文中最有效地使用变量标签重命名变量。我可以做到这一点,但看起来很笨拙。

var1<-rnorm(100)
var2<-rnorm(100)
var3<-rnorm(100)
group_var<-sample(c("A", "B"), size=100, replace=T)
other_var1<-rnorm(100)
other_var2<-rnorm(100)
df<-data.frame(var1, var2, var3, group_var, other_var1, other_var2)
library(labelled)
library(tidyverse)
df %>% 
  set_variable_labels(var1="Measure 1", 
                      var2="Measure 2",
                      var3="Measure 3",
                        group_var="Grouping Variable")->df


#Store variable labels
df %>% 
  select(starts_with("var")) %>% 
  var_label() %>% 
  unlist()->variable_labels
variable_labels<-data.frame(name=names(variable_labels), labels=variable_labels)
df %>% 
  pivot_longer(var1:var3) %>% 
  left_join(., variable_labels, by="name")
  
Run Code Online (Sandbox Code Playgroud)

有没有办法让这个rename_with功能在这里发挥作用?这不行。

df %>% 
  rename_with(., function(x) var_label(x),.cols=var1:var3)
Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

我们可以在从数据集创建的命名列表或向量上使用!!!withrenamevariable_labels

library(dplyr)
library(tibble)
df <- df %>% 
   rename(!!! deframe(variable_labels[2:1]))
Run Code Online (Sandbox Code Playgroud)

-检查名字

> names(df)
[1] "Measure 1"  "Measure 2"  "Measure 3"  "group_var"  "other_var1" "other_var2"
Run Code Online (Sandbox Code Playgroud)

或者如果我们想使用rename_with

df <- df %>%
  rename_with(~ variable_labels$labels, 
      .cols = variable_labels$name)
Run Code Online (Sandbox Code Playgroud)

var_label不起作用的原因是因为它正在查找列的值而不是列名称,即根据?var_label

x - 向量或 data.frame

var_label("var1")
NULL
Run Code Online (Sandbox Code Playgroud)

然而

> var_label(df$var1)
[1] "Measure 1"
Run Code Online (Sandbox Code Playgroud)

如果我们挖掘这个函数rename_with.data.frame就会更明显

getAnywhere('rename_with.data.frame')
function (.data, .fn, .cols = everything(), ...) 
{
    .fn <- as_function(.fn)
    cols <- tidyselect::eval_select(enquo(.cols), .data)
    names <- names(.data)
    names[cols] <- .fn(names[cols], ...)
    names <- vec_as_names(names, repair = "check_unique")
    set_names(.data, names)
}
Run Code Online (Sandbox Code Playgroud)

.fn或 lambda 函数应用于列名称。因此,当我们使用 时var_label,它需要 data.frame 或 vector 并且失败

- 在修改后的函数中添加了打印语句

rename_with_mod <- function (.data, .fn, .cols = everything(), ...) 
{
   
    cols <- tidyselect::eval_select(enquo(.cols), .data)
    print("cols")
    print(cols)
    names <- names(.data)
    print("names")
    print(names)
    .fn <- rlang::as_function(.fn)
    print(names[cols])
    .fn(names[cols], ...)
    
}
Run Code Online (Sandbox Code Playgroud)

-测试

 # lambda function to return the column name
 > df %>% 
  + rename_with_mod(~ .x, .cols=var1:var3)
[1] "cols"
var1 var2 var3 
   1    2    3 
[1] "names"
[1] "var1"       "var2"       "var3"       "group_var"  "other_var1" "other_var2"
[1] "var1" "var2" "var3"
[1] "var1" "var2" "var3"
# lambda function where we apply the var_label - returns NULL
> df %>% 
+   rename_with_mod(~ var_label(.x), .cols=var1:var3)
[1] "cols"
var1 var2 var3 
   1    2    3 
[1] "names"
[1] "var1"       "var2"       "var3"       "group_var"  "other_var1" "other_var2"
[1] "var1" "var2" "var3"
NULL
Run Code Online (Sandbox Code Playgroud)