R:在向量列表中查找共性并删除不常见的部分

时间:2016-11-02 08:30:16

标签: r match

假设我有一个这样的列表:

l <- list('shoes for sell','hats for sell','suits for sell','bow ties for sell')

常见的模式是出售(我想保留),我想删除:鞋子,帽子,西装和领结。有没有办法做到这一点?

我现在最好的尝试涉及pmatchtable。但他们不会产生我想要的东西。任何帮助表示赞赏!

table(unlist(l)) # just counts all the sentences one time.
pmatch('for sell',unlist(l), duplicates.ok = T)) #returns NA

预期输出为:

[1] for sell 
[2] for sell 
[3] for sell 
[4] for sell

我需要将模式放回到我的数据框中的列中,以便位置不会改变

真实数据示例

list(c("Voetbalshirts", "Bedrukken"), c("Nieuwste", "Trainingspakken", 
"2017"), c("Nieuwste", "Trainingspakken", "2016"), c("Trainingspakken", 
"2016"), c("Nieuwe", "Trainingspakken", "2017"), c("Nieuwste", 
"Voetbalschoenen", "2017"), c("Voetbalschoenen", "2017"), c("Voetbalschoenen", 
"2016"), c("Nieuwste", "Voetbalschoenen", "2016"), c("Trainingskleding", 
"Kopen"), c("Trainingskleding", "Nodig?"), c("Keeper", "Handschoenen", 
"Nodig?"), c("Keeper", "Handschoenen", "Kopen"), c("Voetbalshirts", 
"met", "Eigen", "Naam?"), c("Trainingspakken", "2017"), c("Kunstgras", 
"Schoenen", "Nodig?"), c("Kunstgras", "Schoenen", "Kopen"), c("Zaalvoetbalschoenen", 
"Kopen"), c("Zaalvoetbalschoenen", "Nodig?"), c("Indoor", "Voetbalschoenen", 
"Nodig?"), c("Indoor", "Voetbalschoenen", "Kopen"), c("Goedkope", 
"Voetbalschoenen", "Kopen"), c("Voetbalschoenen", "Outlet"), 
    c("Voetbalschoenen", "met", "Sok", "Nodig?"), c("Voetbalschoenen", 
    "met", "Sok", "Kopen"), c("Voetbal", "Trainingspakken", "Kopen"
    ), c("Voetbal", "Trainingspakken", "Nodig?"), c("Trainingspakken", 
    "Kopen"), c("Voetbalpakken", "Nodig?"), c("Voetbalpakjes", 
    "Kopen"), c("Kids", "Keeper", "Handschoenen", "Nodig"), c("Kids", 
    "Keeper", "Handschoenen", "Kopen"), c("Voetbalschoenen", 
    "Online", "Kopen."), c("Voetbalschoenen", "Kopen"), c("Voetbalschoenen", 
    "Nodig?"), c("Trainingspakken", "Nodig?"), c("Voetbalpakken", 
    "Kopen"), c("Voetbalshirts", "Nodig?"), c("Voetbalshirts", 
    "Kopen"), c("Voetbalpakjes", "Nodig?"), c("Adidas", "Voetbalschoenen", 
    "Nodig?"), c("Adidas", "Voetbalschoenen", "Kopen"), c("Nike", 
    "Voetbalschoenen", "Kopen"), c("Nike", "Voetbalschoenen", 
    "Nodig?"))

或者

> dput(l)
list("Voetbalshirts Bedrukken", "Nieuwste Trainingspakken 2017", 
    "Nieuwste Trainingspakken 2016", "Trainingspakken 2016", 
    "Nieuwe Trainingspakken 2017", "Nieuwste Voetbalschoenen 2017", 
    "Voetbalschoenen 2017", "Voetbalschoenen 2016", "Nieuwste Voetbalschoenen 2016", 
    "Trainingskleding Kopen", "Trainingskleding Nodig?", "Keeper Handschoenen Nodig?", 
    "Keeper Handschoenen Kopen", "Voetbalshirts met Eigen Naam?", 
    "Trainingspakken 2017", "Kunstgras Schoenen Nodig?", "Kunstgras Schoenen Kopen", 
    "Zaalvoetbalschoenen Kopen", "Zaalvoetbalschoenen Nodig?", 
    "Indoor Voetbalschoenen Nodig?", "Indoor Voetbalschoenen Kopen", 
    "Goedkope Voetbalschoenen Kopen", "Voetbalschoenen Outlet", 
    "Voetbalschoenen met Sok Nodig?", "Voetbalschoenen met Sok Kopen", 
    "Voetbal Trainingspakken Kopen", "Voetbal Trainingspakken Nodig?", 
    "Trainingspakken Kopen", "Voetbalpakken Nodig?", "Voetbalpakjes Kopen", 
    "Kids Keeper Handschoenen Nodig", "Kids Keeper Handschoenen Kopen", 
    "Voetbalschoenen Online Kopen.", "Voetbalschoenen Kopen", 
    "Voetbalschoenen Nodig?", "Trainingspakken Nodig?", "Voetbalpakken Kopen", 
    "Voetbalshirts Nodig?", "Voetbalshirts Kopen", "Voetbalpakjes Nodig?", 
    "Adidas Voetbalschoenen Nodig?", "Adidas Voetbalschoenen Kopen", 
    "Nike Voetbalschoenen Kopen", "Nike Voetbalschoenen Nodig?")

2 个答案:

答案 0 :(得分:2)

如果我理解正确,我认为你需要先找出列表所有元素中的常用词(不像硬编码for sell

l <- list('shoes for sell','hats for sell','suits for sell','bow ties for sell')

将每个列表元素拆分为单词

lst <- sapply(l, function(x) strsplit(x, " "))

查找所有列表中的常用词语

Reduce(intersect, lst)

#[1] "for"  "sell"

现在,如果您希望for sell重复列表中的每个元素

rep(paste0(Reduce(intersect, lst), collapse = " "), length(l))

#[1] "for sell" "for sell" "for sell" "for sell"

或者您可以使用任何功能(str_extractstr_match)从列表中提取常用字词。

答案 1 :(得分:0)

您还可以将函数str_match_all用于相同的

unlist(str_match_all(l,"for sell"))
[1] "for sell" "for sell" "for sell" "for sell"