我有一个数据框,其中包含许多产品的标记和名称,如下所示:
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 )
我在sapply
和gsub
:
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
问题是什么。
任何帮助都将不胜感激。
答案 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