【问题标题】:Struggling to mutate columns elegantly in tidyverse努力在 tidyverse 中优雅地改变列
【发布时间】:2021-07-08 19:57:54
【问题描述】:

我正在处理 PUMS 数据,并且正在使用 tidycensus 转换某些列的值。但是,这会添加一个具有结构的新列:columnname_label。我想使用 mutate 将原始列替换为 columnname_label 中的新翻译值。这是我的数据框的示例:

df <-data.frame(Region= c(1,2,1,4,3,1), 
                Region_label = c("North", "South", "North", "West", "East", "North"),
                Broadband = c(0,1,0,0,0,1)
                Broadband_label = c("No","Yes","No","No","No","Yes")
                Hispeed = c(1,1,0,0,1,0)
                Hispeed_label = c("Yes", "Yes","No","No","Yes","No")


我知道我可以使用 tidycensus 写出这样的代码:

library(tidyverse)

recode <- df %>% mutate(Region = Region_label) %>% mutate(Broadband = Broadband_label) %>% 
          mutate(Hispeed = Hispeed_label)

但是,我有 66 列需要与“_label”列匹配。有没有比编写 66 个 mutate 语句更优雅的方法来执行此操作?

我曾尝试使用 mutate_at 编写循环,但它不起作用。

subset1 <- grep('*label*',names(df),value = TRUE) 

name <- names(df)

for (i in subset1) {
  

final <- final_house %>% mutate_at(vars(matches(trimws(name,"right","\\_label"))),i) 

}

这不起作用。

谢谢!

【问题讨论】:

    标签: r for-loop tidyverse dplyr


    【解决方案1】:

    首先,选择所有以"label" 结尾的列。然后您可以使用表示提取字符串直到第一个下划线 (_)。

    df %>% 
      select(ends_with("label")) %>% 
      rename_with(~ str_extract(.x, "^[^_]+(?=_)"))
    

    请注意,您需要 dplyr 版本 1.0.0 或更新版本。

    【讨论】:

      【解决方案2】:
      library(dplyr)
      
      df %>% 
        select(ends_with("label")) %>% 
        rename_with(~ gsub("_label","", .))
      

      输出

        Region Broadband Hispeed
      1  North        No     Yes
      2  South       Yes     Yes
      3  North        No      No
      4   West        No      No
      5   East        No     Yes
      6  North       Yes      No
      

      【讨论】:

        【解决方案3】:

        使用across,这将为名称为 X 的每个列分配名称为 X_label 的列。如果可能存在没有对应 _label 列的列,则将across 的第一个参数替换为sub("_label$", "", subset1),其中subset1 在问题中定义。

         df %>% 
           mutate(across(!ends_with("_label"), 
                         ~ cur_data()[[paste0(cur_column(), "_label")]]))
        

        给予:

          Region Region_label Broadband Broadband_label Hispeed Hispeed_label
        1  North        North        No              No     Yes           Yes
        2  South        South       Yes             Yes     Yes           Yes
        3  North        North        No              No      No            No
        4   West         West        No              No      No            No
        5   East         East        No              No     Yes           Yes
        6  North        North       Yes             Yes      No            No
        

        请注意,上面的内容很容易使用基数 R:

        replace(df, sub("_label$", "", subset1), df[subset1])
        

        或添加管道:

        df %>% replace(sub("_label$", "", subset1), .[subset1])
        

        【讨论】:

          猜你喜欢
          • 2019-07-22
          • 1970-01-01
          • 1970-01-01
          • 2012-04-23
          • 1970-01-01
          • 1970-01-01
          • 2018-09-03
          • 1970-01-01
          • 2011-12-08
          相关资源
          最近更新 更多