【问题标题】:R: delete a substring from a string on a dataframe [duplicate]R:从数据帧上的字符串中删除子字符串[重复]
【发布时间】:2016-01-18 11:53:57
【问题描述】:

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

    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

请问有什么问题。

任何帮助将不胜感激。

【问题讨论】:

  • 您能否详细说明您已经尝试过的内容,即发布一些代码?
  • 更新后的例子中,没有mark?
  • 其实是的。我以mark 为例
  • 这可能是thisthis 的某种类型的欺骗

标签: r dataframe


【解决方案1】:

如果我们需要通过删除以“mark”开头的“name”元素来对行进行子集化,则使用grep

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

^ 表示字符串的开始。

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

更新

基于更新的数据集,如果我们要检查在任何 'mark' 元素中没有匹配子字符串的 'name',我们可以将 paste 和 'mark' 元素一起使用 grep获取索引,然后使用[ 子集,

df1[!grepl(paste(df1$mark, collapse="|"), df1$name),]

或者,如果想法是根据 'name'、'mark'、stri_detect 的相应元素从 stringi 中对行进行子集化,则可以选择。

library(stringi)
df1[!stri_detect_fixed(df1$name, df1$mark),]

【讨论】:

  • @user5779182 检查更新是否有帮助。
  • df1[!grepl(paste(df1$mark, collapse="|"), df1$name),] 还会从不同的行中删除有标记名称的行 - 不确定是否需要这样做
  • @docendodiscimus 由于 OP 没有显示预期的结果,我添加了两个选项。 stringi 应该适用于每一行。
  • @akrun 。 grepl 函数没问题:我使用了这个代码示例 df1$CheckMark &lt;- Vectorize(grepl)(df1$mark, df1$name)。我现在想从产品名称中删除标记。有什么想法吗?
  • @akrun ,通过mapply 切换sapply 解决了问题:df1=as.data.frame(mapply(gsub,df1$mark,"",df1$name))。感谢您的时间和努力。
猜你喜欢
  • 1970-01-01
  • 2018-02-20
  • 2021-05-30
  • 2018-06-09
  • 2020-11-12
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 2021-04-13
相关资源
最近更新 更多