我正在尝试在数据框中创建一个唯一列,该数据框的字符数字匹配两个字符串的左侧侧的两个字符串。
每行代表一个比较字符串,我们希望将其用作针对用户给定字符串的测试。给定一个数据框:
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),当字符不排列时不检查字符串的其余部分并记录匹配数字。
提前谢谢!
答案 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)]))