очистка грязного столбца символов в R
У меня есть колонка следующего содержания.
Id Feedback
1 c("No", "No", "No", "No", "No", "No")
2 c("No", "No", "No")
3 c("No", "No", "No", "No", "Taking Medication")
Я пытаюсь избавиться от No такого, что конечные результаты после очистки должны выглядеть так
Id Feedback
1
2
3 "Taking Medication"
Я попробовал использовать функцию sub
это не сработало. Я связал с помощью gsub
функция работала, но результаты грязные. Когда я использую df1$Feedback = gsub("No", "", df1$Feedback)
, результаты выглядят следующим образом
Id Feedback
1 c("", "", "", "", "", "")
2 c("", "", "")
3 c("", "", "", "", "Taking Medication")
Любая помощь в этом вопросе очень ценится.
2 ответа:
Мы разделяем столбец "обратная связь" на " нет " или (
|
) цитату ("
). Выход - этоlist
. Мы делаем петлю черезlist
сvapply
,grep
чтобы получить числовой индекс элементов, являющихся алфавитами или пробелами от начала до конца строки (^[A-Za-z ]$
). Мы создаем логическое условие, т. е.if
length
индекса больше 0, мы возвращаем элемент, соответствующий 'x1' илиelse
возвращаемNA
.df1$Feedback <- vapply(strsplit(df1$Feedback, 'No|"'), function(x) { x1 <- grep('^[A-Za-z ]+$', x) if(length(x1)>0) x[x1] else ''}, character(1)) df1 # Id Feedback #1 1 #2 2 #3 3 Taking Medication
Или другой вариант -
gsub
. Мы сопоставляем подстроку " нет " или (|
) двойные кавычки, запятая, скобки ([",()]
) или (|
) буква "С", за которой следуют скобки (c(?:\\()
), и замените ее на''
. Ведущие / отстающие пространства могут быть удалены с помощью второгоgsub
.gsub('^\\s*|\\s*$', '', gsub('No|[",()]|c(?:\\()', '', df1$Feedback, perl=TRUE)) #[1] "" "" "Taking Medication"
Данные
df1 <- structure(list(Id = 1:3, Feedback = c("c(\"No\", \"No\", \"No\", \"No\", \"No\", \"No\")", "c(\"No\", \"No\", \"No\")", "c(\"No\", \"No\", \"No\", \"No\", \"Taking Medication\")" )), .Names = c("Id", "Feedback"), class = "data.frame", row.names = c(NA, -3L))