清理 R 中凌乱的字符列

cleaning a messy character column in 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")

非常感谢有关此问题的任何帮助。

library(dplyr)
library(tidyr) 

your_data_frame %>%
  group_by(Id) %>%
  do(.$Feedback %>% 
           parse(text = .) %>% 
           eval %>%
           {data_frame(Feedback = .)}) %>%
  filter(Feedback != "No")

我们将 'Feedback' 列拆分为 'No' 或 (|) 引用 (")。输出是 list。我们使用 vapplygrep 循环遍历 list 以获取字母元素的数字索引或 space 从字符串的开始到结束(^[A-Za-z ]$ ).我们创建一个逻辑条件,即if索引的length大于0,我们return对应'x1'或else[=44的元素=] 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。我们匹配子字符串 'No' 或 (|) 双引号、逗号、括号 ([",()]) 或 (|) 字母 'c' 后跟括号 (c(?:\()) 并将其替换为 ''。 leading/lagging space 可以使用第二个 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))