2

我有一个专栏如下。

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

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

4

2 回答 2

2

|我们用“否”或 ( ) 引号 ( )分隔“反馈”列"。输出是一个list。我们遍历listwith vapply, 以获取从字符串 ( )grep开始到结尾的字母或空格元素的数字索引。^[A-Za-z ]$我们创建一个逻辑条件,即if索引length的大于0,我们返回'x1'对应的元素或者elsereturn 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(?:\\()) 并将其替换为''。可以使用第二个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))
于 2015-09-14T04:51:42.140 回答
-2
library(dplyr)
library(tidyr) 

your_data_frame %>%
  group_by(Id) %>%
  do(.$Feedback %>% 
           parse(text = .) %>% 
           eval %>%
           {data_frame(Feedback = .)}) %>%
  filter(Feedback != "No")
于 2015-09-14T04:26:26.217 回答