Очистка грязного столбца символов в 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")
Другие вопросы по тегам