以向量化方式比较字符串以进行匹配

时间:2018-08-08 11:27:36

标签: r string dataframe vectorization

我有一个大数据框,其中包含两列,其中包含字符串。当这些列不相等时,我要执行操作。

问题在于,当我使用简单的!=运算符时,它给出的结果不正确。即显然,'Tout_Inclus''Tout_Inclus'是不相等的。

这使我可以使用字符串比较功能,例如pracma软件包中的strcmp。但是,这不是向量化的-我的数据框有960万行,因此,我认为如果循环遍历,这将导致崩溃/老化。

有人有矢量化的方法来比较字符串吗?

我的数据框如下:

    City_Break  City_Break
    City_Break  City_Break
    Court_Break Court_Break
    Petit_Budget    Petit_Budget
    Pas_Cher    Pas_Cher
    Deals   Deals_Pas_Chers
    Vacances    Vacances_Éco
    Hôtel_Vol   Hôtel_Vol
    Dernière_Minute Dernière_Minute
    Formule Formule_Éco
    Court_Séjour    Court_Séjour
    Voyage  Voyage_Pas_Cher
    Séjour  Séjour_Pas_Cher
    Congés  Congés_Éco

当我执行类似df[colA != colB,]的操作时,它给出错误的结果,即字符串(通过查看它们)相等。

我确保编码为UTF-8,字符串不是影响因素,并且我还尝试在进行比较之前删除特殊字符。

顺便说一下,这些字符串来自多种语言。

编辑:我已经修剪了空格,但仍然没有运气

2 个答案:

答案 0 :(得分:1)

尝试从两列中删除前导/后缀空格,然后进行比较:

df[trimws(df$colA, "both") != trimws(df$colB, "both"), ]

答案 1 :(得分:0)

如果一切都很好(修剪等),则可能是编码问题。在UTF-8中,相同的重音字符可以用不同的字节序列表示。它可以是单字节编码的,也可以带有修饰符字节。但是,对于“ Tout_Inclus”非常奇怪。
只是要检查一下,请从 stringi 包尝试以下操作:

stringi::stri_compare(df$colA,df$colB, "fr_FR")

输出是什么?