【发布时间】: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 )
我发现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
请问有什么问题。
任何帮助将不胜感激。
【问题讨论】: