очистка грязного столбца символов в 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 2

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")