Если у вас есть список, вы можете использовать синтаксис dplyr :: case_when:
library(dplyr)
df <- data.frame(fullprtvt = sample(c('Dansk Folkeparti',
'Dansk Folkeparti - Danish peoples party',
'Sverigedemokraterna',
'Progress Party (FrP)',
'Progress Party (FRP)',
'Moderate party',
'Communist',
'Socialist',
'Democrat'), 10, TRUE))
left<-c(
'Sverigedemokraterna',
'Progress Party (FrP)',
'Progress Party (FRP)',
'Moderate party',
'Communist',
'Socialist')
right<-c(
'Dansk Folkeparti',
'Dansk Folkeparti - Danish peoples party')
df %>%
mutate(fullprtvt=as.character(fullprtvt)) %>%
mutate(affiliation =
case_when(
fullprtvt %in% left ~ "left",
fullprtvt %in% right ~ "right",
TRUE ~ fullprtvt
))
Это приведет к:
fullprtvt affiliation
1 Dansk Folkeparti right
2 Dansk Folkeparti right
3 Socialist left
4 Dansk Folkeparti - Danish peoples party right
5 Progress Party (FrP) left
6 Progress Party (FrP) left
7 Progress Party (FrP) left
8 Moderate party left
9 Sverigedemokraterna left
10 Dansk Folkeparti - Danish peoples party right
Это может быть расширено для строк в именах сторон:
# строк
left <- Hmisc::Cs(progres, commun, soc)
centre <- Hmisc::Cs(moderat, demo)
right <- Hmisc::Cs(people, folk)
regexStr <- paste0(c(left,centre, right), collapse = "|")
df %>%
mutate(fullprtvt =
as.character(fullprtvt) )%>%
mutate(shortprtvt=
str_extract(
string = str_to_lower( fullprtvt),
pattern = regexStr)) %>%
mutate(affiliation =
case_when(
shortprtvt %in% left ~ "left",
shortprtvt %in% centre ~ "centre",
shortprtvt %in% right ~ "right",
TRUE ~ fullprtvt
))
Мы получаем результат (обратите внимание, что regex и case_when могут быть изменены далее, чтобы обнаружить, если два слова, из которых одно сигнализирует о выходе, другие сигналы, скажем, аграрник, на самом деле не должен означать не левый, а центр или правый ....)
fullprtvt shortprtvt affiliation
1 Dansk Folkeparti - Danish peoples party folk right
2 Democrat demo centre
3 Progress Party (FRP) progres left
4 Progress Party (FRP) progres left
5 Socialist soc left
6 Democrat demo centre
7 Progress Party (FRP) progres left
8 Dansk Folkeparti folk right
9 Sverigedemokraterna demo centre
10 Sverigedemokraterna demo centre