Я далек от того, чтобы быть регулярным выражением экспертом, но я поставлю здесь подход tidyverse :
Actor1 <- c("Driver","NA","","")
Actor2 <- c("President","Zombie","","")
Actor3 <- c("CEO","Devil","","")
Actor4 <-c("Priest","","Killer","Mayor")
library(tidyverse)
data.frame(Actor1, Actor2, Actor3, Actor4) %>%
mutate_all(~str_replace(., pattern = "NA", replacement = "")) %>%
unite(col = "combined", sep = ";", remove = F) %>%
mutate(combined = str_replace_all(combined, pattern = "^[:punct:]|[:punct:]$|[:punct:]{2,}", replacement = "")) %>%
select(-combined, everything(.), combined)
#> Actor1 Actor2 Actor3 Actor4 combined
#> 1 Driver President CEO Priest Driver;President;CEO;Priest
#> 2 Zombie Devil Zombie;Devil
#> 3 Killer Killer
#> 4 Mayor Mayor
Если вы хотите просто немного из столбцов, вы можете передать их в unite
:
data.frame(Actor1, Actor2, Actor3, Actor4) %>%
mutate_all(~str_replace(., pattern = "NA", replacement = "")) %>%
unite(Actor2, Actor4, col = "combined", sep = ";", remove = F) %>%
mutate(combined = str_replace_all(combined, pattern = "^[:punct:]|[:punct:]$|[:punct:]{2,}", replacement = "")) %>%
select(-combined, everything(.), combined)
#> Actor1 Actor2 Actor3 Actor4 combined
#> 1 Driver President CEO Priest President;Priest
#> 2 Zombie Devil Zombie
#> 3 Killer Killer
#> 4 Mayor Mayor