代码之家  ›  专栏  ›  技术社区  ›  spindoctor

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

  •  0
  • spindoctor  · 技术社区  · 11 月前

    我有一个标记变量的数据帧,使用导入 haven R包装。 对于变量的子集,我想使用变量标签的一部分。我有一个很好的正则表达式,可以工作,但我不明白为什么 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 .

    使用有什么问题 地图 在这里输入是一个列表,然后我提供一个函数。那到底发生了什么?

    1 回复  |  直到 11 月前
        1
  •  0
  •   Stibu    11 月前

    的第二个论点 map() 必须是函数或公式。因此,这两种方法中的任何一种都有效:

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

    的文档 地图 更喜欢第一个版本:

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

        2
  •  -1
  •   Vraj Pithwa    11 月前

    'map' 'var_label()' 已经返回字符否决器,而不是列表。

    而不是使用 地图 您可以直接应用 '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)