如何使用R中的map和str_remove_all从变量标签中提取一些信息

问题描述 投票:0回答:2

我有一个使用 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
有什么问题。输入是一个列表,然后我提供一个函数。那么这是怎么回事?

r regex purrr stringr
2个回答
0
投票

map()
的第二个参数必须是函数或公式。所以这两个作品之一:

df %>% 
  var_label() %>% 
  map(., \(x) str_remove_all(x, ".+ - "))

df %>% 
  var_label() %>% 
  map(., ~str_remove_all(., ".+ - "))

map()
的文档更喜欢第一个版本:

一个公式,例如~ .x + 1。您必须使用 .x 来引用第一个参数。仅当您需要向后兼容旧版本的 R 时才推荐。


0
投票

'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)
© www.soinside.com 2019 - 2024. All rights reserved.