R:从数据帧上的字符串中删除子字符串

时间:2016-01-18 11:53:58

标签: r dataframe

我有一个数据框,其中包含许多产品的标记和名称,如下所示:

    mark      name
    Caudalie  Caudalie Eau démaquillante 200ml
    Mustela   Mustela Bébé lait hydra corps 300ml
    Lierac    Lierac Phytolastil gel prévention 

在许多行中,商标名称中存在标记。我想要做的是检测产品名称中是否存在标记,如果是,我想删除它。

修改 我使用此代码示例来检测产品名称中是否存在标记:

   df1$CheckMark <- Vectorize(grepl)(df1$mark, df1$name)

我的数据框现在看起来像这样:

    mark      name                                ChekMark
    Caudalie  Caudalie Eau démaquillante 200ml    TRUE
    Mustela   Mustela Bébé lait hydra corps 300ml TRUE
    Lierac    Lierac Phytolastil gel prévention   TRUE

我想从产品名称中对标记进行子集化。

更新 经过多次尝试。我根据标记将我的大数据帧切换到了一个列表:

    list.mark.name=split( df1 , df1$mark )

我在sapplygsub

之间找到了这个很棒的组合
    listt<-sapply(1:length(list.marque.nom), function(i)
    {
     dtfr<-list.marque.nom[[i]]
      if(dtfr$CheckMark==TRUE)
     {listt[[i]]<-as.data.frame(sapply(dtfr,gsub,pattern=dtfr$mark,replacement=""))}
      else
     {listt[[i]]<-dtfr} 
     }

我认为一切都很好但我注意到了这些警告:

     Warning messages:
     1: In if (dtfr$CheckMark == TRUE) { ... :
      the condition has length > 1 and only the first element will be used

问题是什么。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果我们需要通过删除&#34; name&#34;来对行进行子集化。以&#39;标记&#39;开头的元素,然后使用grep

df1[!grepl('^mark', df1$name),]

^表示字符串的开头。

注意:标题中的subtract部分不清楚。

更新

根据更新的数据集,如果我们想要检查名称&#39;在任何&#39;标记&#39;中都没有匹配的子字符串。我们可以paste标记&#39;将元素组合在一起并使用grep获取索引,然后使用[

进行子集化
df1[!grepl(paste(df1$mark, collapse="|"), df1$name),]

或者,如果想要根据&#39; name&#39;的相应元素对行进行子集化,那么可以选择stri_detect stringi library(stringi) df1[!stri_detect_fixed(df1$name, df1$mark),] 。{ / p>

CLBeaconRegion