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をループしてvapplygrep文字列 ( ) の先頭から末尾までのアルファベットまたはスペースである要素の数値インデックスを取得します^[A-Za-z ]$。論理条件を作成します。つまりiflengthインデックスの が 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(?:\\()) を照合し、それを に置き換え''ます。前後のスペースは、2 番目の を使用して削除できます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 に答える