consider my labelled df1 below
This is my second dataframe df2
I want to change item column in df2 such that if its rows contains any names of df1, that string is replaced by the column label like below
any approach to achieve this is highly appreciated.
library(Hmisc)
library(dplyr)
df1 <- data.frame(low = rep(1,3),
med = rep(2,3),
high = rep(3,3),
other = rep(0,3))
label(df1$low) <- "is it low"
label(df1$med) <- "is it med"
label(df1$high) <- "is it high"
label(df1$other) <- "is it broken"
df2 <- data.frame(item = c("lowYes", "medNo", "high"),
value = c(12, 10, 14))
df3 <- data.frame(item = c("is it low:No", "is it med:Yes", "is it high"),
value = c(12, 10, 14))
library(stringr)
df2$item <- str_replace(df2$item, grep(df2$item, names(df1)), label(df1)) # not for all rows
CodePudding user response:
Extract the label from the 'df1' and create a named vector (unlist), then use the named vector in str_replace_all for modifying the 'item' column by matching the key value with the substring in 'item' column
library(dplyr)
library(stringr)
library(Hmisc)
keyval <- df1 %>%
summarise(across(everything(), ~ str_c(label(.x), ":"))) %>%
unlist
df3 <- df2 %>%
mutate(item = trimws(str_replace_all(item, keyval), whitespace = ":"))
-output
df3
item value
1 is it low:Yes 12
2 is it med:No 10
3 is it high 14



