努力在tidyverse中优雅地变异列
我正在使用PUMS数据,并使用tidycensus转换某些列的值。但是,这会添加一个具有以下结构的新列:columnname\u label。我想使用mutate在columnname\u标签中用新的转换值替换原始列。以下是我的数据框示例:努力在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
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])