努力在tidyverse中优雅地变异列

努力在tidyverse中优雅地变异列,r,for-loop,tidyverse,mutate,R,For Loop,Tidyverse,Mutate,我正在使用PUMS数据,并使用tidycensus转换某些列的值。但是,这会添加一个具有以下结构的新列:columnname\u label。我想使用mutate在columnname\u标签中用新的转换值替换原始列。以下是我的数据框示例: df <-data.frame(Region= c(1,2,1,4,3,1), Region_label = c("North", "South", "North&qu

我正在使用PUMS数据,并使用tidycensus转换某些列的值。但是,这会添加一个具有以下结构的新列:columnname\u label。我想使用mutate在columnname\u标签中用新的转换值替换原始列。以下是我的数据框示例:

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")


df%变异(宽带=宽带标签)%>%
变异(Hispeed=Hispeed_标签)
但是,我有66列需要与“\u label”列匹配。有没有一种更优雅的方式来执行此操作,而不是编写66条变异语句

我曾尝试使用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) 

}
subset1
输出

  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

首先,选择以
标签“
结尾的所有列。然后,您可以使用reprex提取字符串,直到第一个下划线(

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

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

中使用
将名称为X的列指定给名称为X的每个列。如果可能有没有相应的_label列的列,则将跨
的第一个参数替换为
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])
replace(df, sub("_label$", "", subset1), df[subset1])
df %>% replace(sub("_label$", "", subset1), .[subset1])