我有一个使用 R 中的
haven
包导入的标记变量的数据框。
对于变量的子集,我想使用变量标签的一部分。我有一个很好的正则表达式,可以工作,但我不明白为什么 map
和 str_remove_all
的组合在这里不起作用。
#random variables
var1<-sample(seq(1,10,1), size=10, replace=T)
var2<-sample(seq(1,10,1), size=10, replace=T)
#Assign variable labels
library(labelled)
var_label(var1)<-"A long variable label - Some Info"
var_label(var2)<-"Another long variable label - Some Other Info"
#Make dataframe
df<-data.frame(var1, var2)
#Confirm variable labels
var_label(df)
#Try to remove relevant string from each
df %>%
var_label() %>%
#Remove everything but what is desired
map(., str_remove_all(., ".+ - "))
输出只是
NULL
。
这里使用
map
有什么问题。输入是一个列表,然后我提供一个函数。那么这是怎么回事?
map()
的第二个参数必须是函数或公式。所以这两个作品之一:
df %>%
var_label() %>%
map(., \(x) str_remove_all(x, ".+ - "))
df %>%
var_label() %>%
map(., ~str_remove_all(., ".+ - "))
map()
的文档更喜欢第一个版本:
一个公式,例如~ .x + 1。您必须使用 .x 来引用第一个参数。仅当您需要向后兼容旧版本的 R 时才推荐。
'map'
通常用于将函数应用于列表的每个元素,但是在这种情况下'var_label()'
已经返回字符向量,而不是列表。
您可以使用
'map'
包中的 'str_remove_all'
直接将 'mutate_all'
函数应用于字符向量的每个元素,而不是使用 'dplyr'
。
library(dplyr)
library(stringr)
# random variables
var1 <- sample(seq(1, 10, 1), size = 10, replace = TRUE)
var2 <- sample(seq(1, 10, 1), size = 10, replace = TRUE)
# Assign variable labels
library(labelled)
var_label(var1) <- "A long variable label - Some Info"
var_label(var2) <- "Another long variable label - Some Other Info"
# Make dataframe
df <- data.frame(var1, var2)
# Confirm variable labels
var_label(df)
# Remove everything but what is desired
df <- df %>%
mutate(across(everything(), ~str_remove_all(var_label(.), ".+ - ")))
# Confirm the updated variable labels
var_label(df)