Очистка грязного столбца символов в R
У меня есть колонка следующим образом.
Id Feedback
1 c("No", "No", "No", "No", "No", "No")
2 c("No", "No", "No")
3 c("No", "No", "No", "No", "Taking Medication")
Я пытаюсь избавиться от такого, чтобы конечные результаты после очистки выглядели так
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))
library(dplyr)
library(tidyr)
your_data_frame %>%
group_by(Id) %>%
do(.$Feedback %>%
parse(text = .) %>%
eval %>%
{data_frame(Feedback = .)}) %>%
filter(Feedback != "No")