Ivan and Bert, thank you so much for your help. Ivan, your solution worked perfectly. I didn't really understand how to do string processing on a vector of strings, and your solution demonstrated it for me. I modified it to work with the tidyverses' stringr library in this way: bg3_race_sum <- bg3_race %>% left_join(pl_vars, by=c("variable" = "name")) %>% group_by(variable) %>% summarize(count = sum(value)) %>% left_join(pl_vars, by=c("variable" = "name")) %>% filter(count > 0) %>% .$label %>% str_replace("^ !!", "") %>% #Drop the leading ' !!' str_replace_all("[^!]*!!", " ") #Replace each !!.* with space Bert, your solution was close to correct. It correctly dropped the right text, but didn't insert a space for each piece of text between "!!" and after the ":". I'm using those spaces to preserve the hierarchical nature of the numbers, how lower numbers (in the chart) are included in higher numbers. For instance, the "Total:" number is the sum of "Population of one race" and "Population of two or more races". Thank you both for helping me with this specific problem and for increasing my knowledge and abilities with R. -Kevin On 6/28/23 16:56, Ivan Krylov wrote:> On Wed, 28 Jun 2023 20:29:23 +0000 > Kevin Zembower via R-help <r-help at r-project.org> wrote: > >> I think my algorithm for the labels is: >> 1. keep everything from the last "!!" up to and including the last >> character >> 2. for everything remaining, replace each "!!.*:" group with a single >> space. > > If you remove the initial ' !!', the problem becomes a more tractable > "replace each group of non-'!' followed by '!!' with one space": > > bg3_race_sum$label |> > (\(.) sub('^ !!', '', .))() |> > (\(.) gsub('[^!]*!!', ' ', .))() > > But that solution could have been impossible if the task was slightly > different. > >> I can split the label using str_split(label, pattern = "!!") to get a >> vector of strings, but don't know how to work on the last string and >> all the rest of the strings separately. > > str_split() would have given you a list of character vectors. You can > use lapply to evaluate a function on each vector inside that list. > Inside the function, use length(x) (if `x` is the argument of the > function) to find out how many spaces to produce and which element of > the vector is the last one. (For code golf points, use rev(x)[1] to get > the last element.) >