[英]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_label
和rename_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.