Я хотел бы удалить все слова из строки, которая начинается с буквы, за которой следуют цифры и заканчиваются точкой с запятой или пробелом. Например, учитывая строку
x <- "Z1; D49; Pay-What-You-Want; A1; Moods; Weather; Social norms, K20"
Желаемый результат
Pay-What-You-Want; Moods; Weather; Social norms;
Спасибо
В вашем примере после данных «Социальные нормы» стоит запятая, ее следует заменить точкой с запятой или это просто опечатка?
Нет, это не опечатка. В идеале он должен содержать точку с запятой, но самое главное — избавиться от слов с одной буквой и цифрами. Данные представляют собой вектор строк, но я могу справиться с этой проблемой.
Вы удалили K20, но он не заканчивается точкой с запятой или пробелом
gsub("([ ]+)?[A-Za-z]\\d+([; ]+)?","",x)
Итак, давайте сделаем это «вектором или строкой», потому что с таким значением легче работать, чем с односимвольным значением.
# if commas should become semicolons then use gsub("
x <- gsub("[,]", ";", "Z1; D49; Pay-What-You-Want; A1; Moods; Weather; Social norms, K20")
# make it a vector
x2 <- trimws(scan(text=x, what = "", sep = ";"))
#If you want it to be one string (which seems odd but doable:
(x3 <- paste( x2[!grepl("^[[:alpha:]](\\d)+",x2)] , collapse = "; ") )
#[1] "Pay-What-You-Want; Moods; Weather; Social norms"
# Or
(x4 <- x2[!grepl("^[[:alpha:]](\\d)+",x2)] )
#[1] "Pay-What-You-Want" "Moods" "Weather" "Social norms"
Насколько я понимаю ваши комментарии, у вас есть вектор символов, каждый элемент которого представляет собой строку, разделенную точкой с запятой (с некоторыми запятыми). Если это так, то с помощью функций stringr внутри sapply():
library(stringr)
sapply(
str_split(x, "(,|;)\\s+"),
\(.x) str_c(.x[!str_detect(.x, "^\\w\\d+$")], collapse = "; ")
)
# [1] "Pay-What-You-Want; Moods; Weather; Social norms"
Или используя базу R:
sapply(
strsplit(x, "(,|;)\\s+"),
\(.x) paste(.x[!grepl("^\\w\\d+$", .x)], collapse = "; ")
)
Вы можете использовать gsub как:
x <- "Z1; D49; Pay-What-You-Want; A1; Moods; Weather; Social norms, K20"
gsub("\\b[a-zA-Z]\\d+[ ;]*", "", gsub(",", ";", x))
#[1] "Pay-What-You-Want; Moods; Weather; Social norms; "
gsub("\\b[a-zA-Z]\\d+[ ;]", "", x) #Does what the question asked for
#[1] " Pay-What-You-Want; Moods; Weather; Social norms, K20"
\\b..Граница слова [a-zA-Z]..начинается с буквы \\d+..по номерам [ ;]..оканчивающийся точкой с запятой или пробелом
Ваши данные на самом деле представляют собой одну длинную строку или вектор строк?