部分字符串匹配行

时间:2016-11-18 17:33:56

标签: r string dataframe string-matching

我正在尝试在数据框中创建一个唯一列,该数据框的字符数字匹配两个字符串的左侧侧的两个字符串。

每行代表一个比较字符串,我们希望将其用作针对用户给定字符串的测试。给定一个数据框:

df <- data.frame(x=c("yhf", "rnmqjk", "wok"), y=c("yh", "rnmj", "ok"))

       x    y
1    yhf   yh
2 rnmqjk rnmj
3    wok   ok

其中x是我们的比较字符串,y是我们给定的字符串,我希望在列z中输出“2,3,0”的值,如下所示:

       x    y    z
1    yhf   yh    2
2 rnmqjk rnmj    3
3    wok   ok    0

基本上,我希望从左侧检查给定的字符串(y) - &gt;对比较字符串(x),当字符不排列时不检查字符串的其余部分并记录匹配数字。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

此代码适用于您的示例:

df$z <- mapply(function(x, y) which.max(x != y),
               strsplit(as.character(df$x), split=""),
               strsplit(as.character(df$y), split="")) - 1

df
       x    y z
1    yhf   yh 2
2 rnmqjk rnmj 3
3    wok   ok 0

作为大纲,strsplit将字符串向量拆分为字符向量列表。这里,向量的每个元素都是单个字符(split =&#34;&#34;参数)。 which.max函数返回第一个位置,其中参数是向量的最大值。由于x != y返回的向量是逻辑的,which.max返回观察到差异的第一个位置。 mapply接受一个函数并列出并将提供的函数应用于列表的相应元素。

请注意,这会产生警告,表示字符串的长度不匹配。这可以通过几种方式解决,最简单的方法是在suppressWarnings中包含函数,如果消息有误。

正如OP在注释中注意到,如果存在整个单词匹配的实例,则which.max返回1.要返回与字符串相同的长度,我将添加第二行代码,将逻辑子集与nchar函数结合起来:

df$z[as.character(df$x) == as.character(df$y)] <-
                        nchar(as.character(df$x[as.character(df$x) == as.character(df$y)]))