簡體   English   中英

在R中用變量標簽重命名變量

[英]rename variables with variable labels in R

我一直在與 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")
  

有沒有辦法讓rename_with函數在這里工作? 這不這樣做。

df %>% 
  rename_with(., function(x) var_label(x),.cols=var1:var3)

我們可以用!!! 在從variable_labels數據集創建的命名列表或向量上rename命名

library(dplyr)
library(tibble)
df <- df %>% 
   rename(!!! deframe(variable_labels[2:1]))

-檢查名稱

> names(df)
[1] "Measure 1"  "Measure 2"  "Measure 3"  "group_var"  "other_var1" "other_var2"

或者如果我們想使用rename_with

df <- df %>%
  rename_with(~ variable_labels$labels, 
      .cols = variable_labels$name)

var_label的原因是因為它正在查找列的值而不是列名,即根據?var_label

x - 一個向量或一個 data.frame

var_label("var1")
NULL

然而

> var_label(df$var1)
[1] "Measure 1"

如果我們挖掘函數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)
}

.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], ...)
    
}

-測試

 # 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

您也可以直接使用屬性:

colnames(data) <- sapply(data, function(x) attr(x, "label"))

或者,如果您更喜歡var_labelrename_with (請注意,這里沒有可用的數據屏蔽,因此data ,而不是.data ):

data |> 
  rename_with(function(x) sapply(x, function(y) var_label(data[[y]])))

帶有標記的haven iris數據的示例:

library(haven)

> path <- system.file("examples", "iris.dta", package = "haven")
> data <- read_dta(path)
> data
# A tibble: 150 × 5
   sepallength sepalwidth petallength petalwidth species
         <dbl>      <dbl>       <dbl>      <dbl> <chr>  
 1        5.10       3.5         1.40      0.200 setosa 
 2        4.90       3           1.40      0.200 setosa 
 3        4.70       3.20        1.30      0.200 setosa 
 4        4.60       3.10        1.5       0.200 setosa 
 5        5          3.60        1.40      0.200 setosa 
 6        5.40       3.90        1.70      0.400 setosa 
 7        4.60       3.40        1.40      0.300 setosa 
 8        5          3.40        1.5       0.200 setosa 
 9        4.40       2.90        1.40      0.200 setosa 
10        4.90       3.10        1.5       0.100 setosa 
# … with 140 more rows
> colnames(data) <- sapply(data, function(x) attr(x, "label"))
> data
# A tibble: 150 × 5
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
          <dbl>       <dbl>        <dbl>       <dbl> <chr>  
 1         5.10        3.5          1.40       0.200 setosa 
 2         4.90        3            1.40       0.200 setosa 
 3         4.70        3.20         1.30       0.200 setosa 
 4         4.60        3.10         1.5        0.200 setosa 
 5         5           3.60         1.40       0.200 setosa 
 6         5.40        3.90         1.70       0.400 setosa 
 7         4.60        3.40         1.40       0.300 setosa 
 8         5           3.40         1.5        0.200 setosa 
 9         4.40        2.90         1.40       0.200 setosa 
10         4.90        3.10         1.5        0.100 setosa 
# … with 140 more rows

考慮在之后使用janitor::make_clean_names讓自己的生活更輕松。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM